用 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) {
// 会用到外部的 trainedweight 来进行运算
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) {
// 实际上是在优化 trainweight
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 实现。