1. 程式人生 > >淺談knn(k近鄰)演算法

淺談knn(k近鄰)演算法

概述

K近鄰演算法是一種懶惰演算法,即沒有對資料集進行訓練的過程,其模型的三個要素:距離度量、k值的選擇和分類決策規則決定。

K近鄰的思想很簡單,即在一個數據集上,給定一個新樣本,找到與新樣本距離最近的k個例項,在這些例項中屬於多數的類即為這個新樣本的類。

李航老師《統計學習方法》中,定義的K近鄰演算法如下:
這裡寫圖片描述

距離度量:

演算法雖然簡單,但在其中也要解決一些問題滴。比如,距離度量該怎麼選擇、k值該怎麼選擇、分類決策規定該怎麼選擇。

對於距離度量,一般使用歐式距離,也可以使用其它距離的度量方式,常見的距離度量如下:
這裡寫圖片描述

K值的選擇:

K值的選擇是一個玄學問題,取小點,太草率;取多點,比如取到資料集的個數,又沒什麼意義。
因此,k值的選擇很大程度上根據經驗來選取。當然可以加些科學的手段,比如用交叉驗證法、貝葉斯法

等方法來確定k的取值。

分類決策規則:

分類決策規則是指在選取k個最近鄰的樣本時,我們該怎麼判斷這個新樣本的類別呢?這裡,我給出兩個思路,歡迎大家留言補充。

1. 多數表決規則

少數服從多數,這k個樣本中,誰的類別最多,聽誰的。所以,多說一句,在二分類問題中,k的取值建議為奇數,這樣不會造成票數持平的狀態。
多數表決法等價於經驗風險最小化,推導如下:
這裡寫圖片描述

2. 加權法
加權法是我的一些思考..算是多數表決法的擴充套件,主要思想是為每個樣本賦予權值,加權最大的類即為推薦的類。在多數表決法中,預設為每個樣本的權值相等

小結:

knn演算法思想成熟,可用於分類也可用於迴歸,其優勢在於:
1.對資料沒有假設,準確度高,對outlier不敏感;
2.KNN演算法是懶惰學習方法,不需要訓練,可以進行增量學習

缺點在於:
1.當樣本不均衡時,選取的臨近K個樣本很可能造成取樣不均,造成預測不精準
2.在資料量較大的情況,knn演算法效率不高。kd樹可以在一定程度上解決這個問題。
3.需要大量的記憶體