1. 綜述html
Cover和Hart在1968年提出了最初的鄰近算法,也被稱爲基於實例的學習或懶惰算法。
與決策樹算法相比,處理訓練集的時候並不創建任何模型,進行分類時纔將測試樣例和全部已知實例進行比較進而分類。
2. 例子算法
上圖中主要有藍色方塊和紅色三角兩種色塊,若是要對綠色未知圓點進行判斷分類,那麼它是屬於藍色方塊仍是紅色三角呢?ide
算法的思路:若是一個樣本在特徵空間中的K個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於這一類別,則該樣本也屬於這個類別。學習
KNN算法通常能夠分爲兩步:測試
上圖中,若是咱們選擇的K值爲1,則離未知圓點最近的一個色塊是藍色,未知實例會被歸類爲藍色。假設咱們選擇的K值爲4,很明顯距離未知圓點最近的4個色塊分別爲:3個紅色三角和1個藍色方塊,那麼未知圓點就會被歸類爲紅色三角(少數服從多數)。ui
因此K的選擇對結果的影響很大,在必定範圍內經過增大K能夠加強抗噪性。idea
對於距離的衡量方式有不少種,例如Euclidean Distance,餘弦值(cos),相關度 (correlation),曼哈頓距離 (Manhattan distance),最經常使用的是Euclidean distance: spa
二維的下距離計算公式如上圖簡單的數學公式,擴展到n維下x,y兩點的距離公式:.net
註解:設n維空間兩點的座標:
Px(x1,x2,...,xn)
Py(y1,y2,...,yn)
那麼Px、Py兩點間距離(平方):
(x1-y1)^2+(x2-y2)^2+.+(xn-yn)^2htm
KNN算法雖然從原理上也依賴於極限原理,但在類別決策時,只於極少許的相鄰樣本有關。因爲KNN算法主要依靠周圍有限的鄰近樣本,而不是依靠判別類域的方法來肯定所屬類別,所以對於類域的交叉或重疊較多的待分樣本集來講,KNN算法較其餘算法更爲適合。
KNN算法不只能夠用於分類,還能夠用於迴歸。經過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就能夠獲得該樣本的屬性。
不足一:須要大量的空間存儲全部實例,以及計算量較大。由於對每個未知實例都要計算它到全部實例的距離,才能求得它的K個最近鄰點。
解決方法:目前經常使用的解決方法是事先對已知樣本點進行剪輯,
事先去除對分類做用不大的樣本。這個解決方法比較適用於那些樣本容量比較大的類域,而樣本容量比較小的類域採用這種算法比較容易產生誤分。
不足二:當其中一類樣本過大,則無論未知實例屬於哪一類,都很容易歸爲數量過大的這一類。
如圖:
由於Y點在紅色區域內,用肉眼去看很容易判斷出它多半屬於紅色一類,可是由於藍色過多,若K值選取稍大則很容易將其歸爲藍色一類。爲了改進這一點,能夠爲每一個點的距離增長一個權重,這樣離得近的點能夠獲得更大的權重,好比距離d,權重1/d。
參考:http://www.cnblogs.com/kuihua/p/5883691.html