# 5分钟带你通过Javascript了解人工智能的基本原理

Javascript是我的“母语”，用它来学习人工智能，记得更牢靠。

### 1. 基本原理

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 yArr = [131, 135, 139, 145]
let zArr = [115, 125, 135, 145]
let loss = 0
yArr.forEach((y, index) => {
let z = zArr[index]
loss += Math.pow(z - y, 2) // (z - y)²
})
loss = loss / data.length
// loss = 93

loss评估出来是93，是大了还是小了，电脑学渣也不太清楚，所以电脑需要进行更多的猜测，从所有猜测中取loss最小时的k和b，当成最终值。

model = {
xArr: [10, 11, 12, 13],
yArr: [131, 135, 139, 145],
k: 10, // 参数1
b: 15, // 参数2
// 损失函数：评估误差用的
getLoss (k, b) {
let zArr = this.xArr.map(x => this.getY(x, k, b))
let loss = 0
this.yArr.forEach((y, index) => {
let z = zArr[index]
loss += Math.pow(y - z, 2) // (y - z)²
})
loss = loss / this.yArr.length
return loss
},
// 规律的公式
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 lossArr = []
kArr.forEach(k => {
bArr.forEach(b => {
lossArr.push({
loss: this.getLoss(k, b), // 通通计算一遍，算出loss
k: k,
b: b
})
})
})
let result = {loss: Infinity}
lossArr.forEach(d => {
if (d.loss < result.loss) {
result = d // 找出最小的loss
}
})
console.log(result.loss)
this.k = result.k
this.b = result.b
}
}
model.learn()
console.log(model.k, model.b)
console.log(model.yArr)
console.log(model.xArr.map(x => model.getY(x, model.k, model.b)))

k = 5
b = 80
yArr = [131, 135, 139, 145]
zArr = [130, 135, 140, 145]

y = kx + b
y = 5 * 14 + 80
y = 150

150cm很合理，这就是人工智能，带着从这里学到的知识，去开发人脸识别吧，呵呵🤪

### 2. 优化猜测算法

$$y = kx + b$$

$$L = \sum_{i=1}^N (y_{i} - z_{i})^2$$

$$y_{i}$$是实际的值，$$z_{i}$$是电脑猜测的值，N是yArr的长度，这里loss我们不用代码表示了，改用数学公式表达，L = loss，看不懂的同学先去学习一下再回来重新看。

$$\frac{\mathrm{d} L}{\mathrm{d} k} = \frac{\mathrm{d} L}{\mathrm{d} z} \frac{\mathrm{d} z}{\mathrm{d} k}$$

$$L = \sum_{i=1}^N (y_{i} - z_{i})^2$$

$$\frac{\mathrm{d} L}{\mathrm{d} z} = \sum_{i=1}^N (2y_{i} - 2z_{i})$$

$$\frac{\mathrm{d} L}{\mathrm{d} z} = \sum_{i=1}^N (2y_{i} - 2kx_{i} - 2b)$$

$$z_{i} = kx_{i} + b$$

$$\frac{\mathrm{d} z}{\mathrm{d} k} = x_{i}$$

2.7k 声望
245 粉丝
0 条评论