5分鐘帶你通過Javascript瞭解人工智慧的基本原理

6666發表於2022-05-14

Javascript是我的“母語”,用它來學習人工智慧,記得更牢靠。

學習人工智慧門檻高不高?我入門花了2個月時間,學習了python、微積分,才大概弄懂了深度學習的基本原理,確實讓人頭大,不過現在回過頭想想,其實基本原理是沒這麼難的。

image.png

經過我的消化之後,表達出來的人工智慧的流程就是:有一些資料,假設這些資料遵循某種規律,但是這個規律裡的具體引數是未知的,讓電腦多次猜測這些引數的值,並從中找到誤差最小的那組引數,就可以對新的資料進行預測

比如有一組身高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很合理,這就是人工智慧,帶著從這裡學到的知識,去開發人臉識別吧,呵呵?

都看到這裡了,給個贊好不好???

相關文章