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很合理,這就是人工智慧,帶著從這裡學到的知識,去開發人臉識別吧,呵呵?
都看到這裡了,給個贊好不好???