Javascript 是我的“母语”,用它来学习人工智能,记得更可靠。
学习人工智能门槛高不高?我入门花了 2 个月工夫,学习了 python、微积分,才大略弄懂了深度学习的基本原理,的确让人头大,不过当初回过头想想,其实基本原理是没这么难的。
通过我的消化之后,表达出来的人工智能的流程就是: 有一些数据,假如这些数据遵循某种法则,然而这个法则里的具体参数是未知的,让电脑屡次猜想这些参数的值,并从中找到误差最小的那组参数,就能够对新的数据进行预测 。
比方有一组身高 x、年龄 y 的数据:
arr = [{x: 10, y: 131},
{x: 11, y: 135},
{x: 12, y: 139},
{x: 13, y: 145},
]
年龄越大,身高越高呗,所以假如身高和年龄遵循的法则是:
y = kx + b
k 和 b 是多少,电脑是个学渣,看了公式和数据一脸懵逼,那就瞎猜一下吧。
k = 10
b = 15
则
10*10 + 15 = 115
10*11 + 15 = 125
10*12 + 15 = 135
10*13 + 15 = 145
看这个瞎猜和理论的值差异是多少,咱们中学学过一个评估的形式,叫做方差,这里用相似的形式来评估:
let y0Arr = [131, 135, 139, 145]
let y1Arr = [115, 125, 135, 145]
let diff = 0
y0Arr.forEach((y0, index) => {let y1 = y1Arr[index]
diff += Math.pow(y1 - y0, 2) // (y1 - y0)²
})
diff = diff / y0Arr.length
// diff = 93
diff 评估进去是 93,是大了还是小了,电脑学渣也不太分明,所以电脑须要进行更多的猜想,从所有猜想中取 diff 最小时的 k 和 b,当成最终值。
用代码残缺得实现就是:
model = {xArr: [10, 11, 12, 13],
y0Arr: [131, 135, 139, 145],
k: 10, // 参数 1
b: 15, // 参数 2
// 损失函数:评估误差用的
getDiff (k, b) {let y1Arr = this.xArr.map(x => this.getY(x, k, b))
let diff = 0
this.y0Arr.forEach((y0, index) => {let y1 = y1Arr[index]
diff += Math.pow(y1 - y0, 2) // (y1 - y0)²
})
diff = diff / this.y0Arr.length
return diff
},
// 法则的公式
getY(x, k, b) {return k * x + b},
// 训练:让电脑瞎猜,理论开发中不是像以下代码这样猜的,然而尽管伎俩不同,原理却是一样的
learn () {
// 让 k 和 b 别离取 1 到 100
let kArr = Array.from(Array(100), (v,i) => i + 1)
let bArr = Array.from(Array(100), (v,i) => i + 1)
let diffs = []
kArr.forEach(k => {
bArr.forEach(b => {
diffs.push({diff: this.getDiff(k, b), // 统统计算一遍,算出 diff
k: k,
b: b
})
})
})
let result = {diff: Infinity}
diffs.forEach(d => {if (d.diff < result.diff) {result = d // 找出最小的 diff}
})
console.log(result.diff)
this.k = result.k
this.b = result.b
}
}
model.learn()
console.log(model.k, model.b)
console.log(model.y0Arr)
console.log(model.xArr.map(x => model.getY(x, model.k, model.b)))
最初,求得
k = 5
b = 80
y0Arr = [131, 135, 139, 145]
y1Arr = [130, 135, 140, 145]
来试试预测个 14 岁的身高
y = kx + b
y = 5 * 14 + 80
y = 150
150cm 很正当,这就是人工智能,带着从这里学到的常识,去开发人脸识别吧,呵呵🤪
都看到这里了,给个赞好不好???