JS 30行代码写人工智障
评论 0 热度 852
用 js 来实现一个简单分类的算法:假定输入参数 a 和 b,如果 a >= b 则返回 1,否则返回 -1。
首先来个定义权重,因为有两个参数,所以应该有两个权重:
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 实现。