K-近鄰(KNN)
1.KNN定義
KNN屬於有監督的學習,其基本思想是:在已知分類的一個訓練數據集中,輸入新的未知分類的實例,通過與訓練數據集中的數據一一對比,找到與該實例最近的k個實例,這k個實例的多數屬於某個類,則將該輸入實例分為這個類。
如下圖,綠色圓作為未知分類的數據被輸入,此時我們根據周圍鄰居的類別對其進行判斷。①當K=3時,紅色三角形占比為2/3,藍色正方形占比為1/3,綠色圓將被判定為紅色三角形;②當K=5時,紅色三角形占比為2/5,藍色正方形占比為3/5,因此綠色圓被判定為藍色正方形。
2.KNN中K值的選擇
如上所述,這裏K值的大小可以任意設定(當K=1時,稱算法為最近鄰算法),但是k值的選擇會對KNN的結果產生重大影響,因此K值的選擇具有極其重要的意義。
當選擇的K值較小時,用於預測的訓練數據集則較小(同上面情形①),此時近似誤差會減小,但是其估計誤差會增大,預測結果對近鄰的實例點非常敏感。若此時近鄰的實例點是噪聲,預測就會出錯。
當選擇的K值較大時,用於預測的訓練數據集則較大(同上面情形②),此時估計誤差會減小,但是其近似誤差又會增大,此時與輸入實例較遠(不相似)的實例也會對預測起作用,使預測發生錯誤。
在實際的應用中,通常會選擇較小的K值。由於K值小時意味著整體的模型變得復雜,容易形成過擬合,因此通常采用交叉驗證的方式選擇最優的K值。
3.KNN相似度計算
特征空間中兩個實例點的距離是衡量兩個實例點相似度的基本度量單位。機器學習中存在多種距離計算方式,通常使用的使歐式距離,也可使用切比雪夫距離或閔可夫斯基距離。
以上距離公式中,當p=1時,稱為曼哈頓距離;當p=2時,即為歐式距離,我們常使用歐式距離計算兩點間相似度;當p=∞時,稱為切比雪夫距離。p值的不同會造成為輸入數據選擇的近鄰不一樣。
4.KNN算法
輸入:訓練數據集T={(x1,y1),(x2,y2),(x3,y3),...,(xn,yn)},其中x為實例特征向量,該向量可以是1維也可以是多維;y為實例的類別,當類別為2時稱二分類,類別較多時則稱為多分類
輸出:未知實例x的類別
①根據給定的距離度量,在訓練集T中找出與輸入實例x最相近的k個點;
②在這k個點中根據分類決策規則(如多數表決)判定x的類別
#--*-- coding:utf-8 --*-- from numpy import * def knn(input, train_datas, label, k, p = 2): dataSize = train_datas.shape[0] #距離計算 diff = tile(input,(dataSize,1)) - train_datas sqdiff = diff ** p #默認p為2,即歐式距離 squareDistance = sum(sqdiff,axis = 1) dist = squareDistance ** (float(1) / p) sortedDistIndex = dist.argsort() #將dist中的元素從小到大排列,並返回該元素之前的索引值 classCount = {} for i in range(k): voteLabel = label[sortedDistIndex[i]] #對選取的K個樣本所屬的類別個數進行統計 classCount[voteLabel] = classCount.get(voteLabel,0) + 1 #選取出現的類別次數最多的類別 maxCount = 0 for key,value in classCount.items(): if value > maxCount: maxCount = value classes = key print ‘輸入實例屬於:‘+ str(classes) + ‘類,其該類近鄰數有‘,str(maxCount) + ‘個‘ if __name__ == ‘__main__‘: x = array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]]) y = [‘A‘,‘A‘,‘B‘,‘B‘] i = array([0.1,0.1]) knn(i, x , y ,k=3,p=1)
輸出結果為:
輸入實例屬於:B類,其該類近鄰數有 2個
reference:
《統計學習學習方法》
《機器學習》
本文出自 “abe” 博客,請務必保留此出處http://abezoo.blog.51cto.com/7223683/1945696
K-近鄰(KNN)