用 js 来实现一个简单分类的算法:假定输入参数 a 和 b,如果 a >= b 则返回 1,否则返回 -1。
首先来个定义权重,因为有两个参数,所以应该有两个权重:
1 2 3 4
| var trainedweight = { a: Math.random(), b: Math.random() };
|
提前说明:设定导入的参数是这个样子:
1 2 3 4 5
| exampleExp = { param_1: 5, param_2: 6, result: -1 }
|
param_1 为第一个参数。result为结果,训练的时候用的,其他时候可有可无。
传递参数,运行计算:
1 2 3 4 5
| function guess(exp) { let rs = (exp.param_1 * trainedweight.a) + (exp.param_2 * trainedweight.b); return (rs >= 0 ? 1 : -1); }
|
训练:
1 2 3 4 5
| function training(exp, error) { trainedweight.a += exp.param_1 * error; trainedweight.b += exp.param_2 * error; }
|
为了方便训练,我们搞一个生成题目和答案的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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); }
|
下面开始训练!
1 2 3 4 5 6
| for (let i = 0; i < 50; i++) { let exampleExp = outexam(0, 1000); let error = exampleExp.result - guess(exampleExp); training(exampleExp, error); }
|
训练过后,trainedweight的值就会改变,以至于可以用guess的算法精确随便地算出两个数字的大小关系 :)
然后让它做题,看看正确率
1 2 3 4 5 6 7 8 9 10 11 12
| 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 实现。