k最近鄰(k-nearest neighbors)
/ kay NEER-ist NAY-burz /
k最近鄰是整個機器學習裡最接地氣的想法:要對一個新案例做出判斷,就找出與它最相似的那幾個舊案例,照搬它們的結果。一位新病人進來——在你的病歷裡查出與他最相似的k位病人,預測大多數人身上發生過的那個結果。這裡沒有方程要擬合,也沒有模型要訓練;資料本身就是模型,答案就是鄰居之間的一次投票。
整個方法繫於兩個選擇。第一,你如何衡量「相似」?通常你把每個例子看作空間裡的一個點——每個特徵對應一根座標軸——再量它們之間的直線距離,於是靠得近的點就相像。第二,你要請教多少位鄰居,也就是k?把k設為1,最近的那一個鄰居說了算,這會讓預測忽上忽下,很容易被雜訊糊弄。把k設得過大,又會把那些遠到與本題無關的案例也一併平均進來,把真實的區別抹糊。最佳的k要靠嘗試不同取值、看哪個泛化得最好來找。
它出奇地簡單,對資料的形狀不作任何假設,還能貼合直線永遠抓不住的彎曲模式。但它在預測時要為此付帳:每做一次判斷,都得掃描整個資料集去找最近的點,資料一大就慢下來。它在高維裡還會栽跟頭——當每個例子有幾百個特徵時,所有點最終都變得幾乎等距,「最近」便失去了意義,這個陷阱叫作維度災難。尺度不同的特徵必須先做歸一化,否則數值最大的那個特徵會悄悄主宰整段距離。
用重量和甜度給一種水果分類。一個新樣本落進散點之間。取k=3時,它最近的三個鄰居是兩個蘋果、一個梨——多數獲勝,於是被標為「蘋果」。改成k=7,範圍內又進來五個梨——結論翻轉。同一個點,不同的k,不同的答案。
k的選擇就是全部關鍵:太小則跳動,太大則糊成一團。
它常被稱為「懶惰」學習器,因為它前期不做功——只是把資料存起來,把全部力氣都拖到預測的時候。務必先對特徵做縮放;否則一個以千計量的特徵,會把另一個以十分之一計量的特徵徹底淹沒。