利用JS搞个神经网络,进行比大小。假定输入参数 a 和 b,如果 a >= b 则返回 1,否则返回 -1。

目测正确率至少64%++,大部分情况正确率达到80%~100%。不要喷为什么不直接用逻辑判断 :(

首先来个定义权重,因为有两个参数,所以应该有两个权重:

var trainedweight = {
  a: Math.random(),
  b: Math.random()
};

提前说明:设定导入的参数是这个样子:

exampleExp = {
  param_1: 5,
  param_2: 6,
  result: -1
}

param_1 为第一个参数。result为结果,训练的时候用的,其他时候可有可无。

传递参数,运行计算:

function guess(exp) {
  // 会用到外部的 trainedweight 来进行运算
  let rs = (exp.param_1 * trainedweight.a) + (exp.param_2 * trainedweight.b);
  return (rs >= 0 ? 1 : -1);
}

训练:

function training(exp, error) {
  // 实际上是在优化 trainweight
  trainedweight.a += exp.param_1 * error;
  trainedweight.b += exp.param_2 * error;
}

为了方便训练,我们搞一个生成题目和答案的函数:

function outexam(minNum, maxNum){
  // 生成题目 和 答案
  var exampleExp = {
    param_1: randomNum(minNum, maxNum),
    param_2: randomNum(minNum, maxNum)
  }
  if (exampleExp.param_1 >= exampleExp.param_2) {
    exampleExp.result = 1;
  } else {
    exampleExp.result = -1;
  }
  return exampleExp;
}
function randomNum(minNum, maxNum) { //随机数
  return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
}

下面开始训练!

for (let i = 0; i < 50; i++) {
  // 训练
  let exampleExp = outexam(0, 1000);
  let error = exampleExp.result - guess(exampleExp);
  training(exampleExp, error);
}

训练过后,trainedweight的值就会改变,以至于可以用guess的算法精确随便地算出两个数字的大小关系 :)

然后让它做题,看看正确率!!

var test = {
  all: 9900,
  correct: 0
};

for (let i = 0; i < test.all; i++) {
  let exampleExp = outexam(0, 500);
  if (exampleExp.result === guess(exampleExp)){
    test.correct++;
  }
}
console.log(test, "正确率:" + Math.round((test.correct / test.all)*100) + "%\n", trainedweight);

最后:别打我,真的就三十几行代码,不信你把核心的那几个函数抄下来 :)

本文指导 (用 js 搭建神经网络):
https://www.jianshu.com/p/9bf0b7bdba1c

更高级的功能请用 ConvNetJS 实现。