k近鄰法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一種基本分類與迴歸方法。html
它的工做原理是:存在一個樣本數據集合,也稱做爲訓練樣本集,而且樣本集中每一個數據都存在標籤,即咱們知道樣本集中每個數據與所屬分類的對應關係。算法
輸入沒有標籤的新數據後,將新的數據的每一個特徵與樣本集中數據對應的特徵進行比較,而後算法提取樣本最類似數據(最近鄰)的分類標籤。ui
通常來講,咱們只選擇樣本數據集中前k個最類似的數據,這就是k-近鄰算法中k的出處,一般k是不大於20的整數。spa
最後,選擇k個最類似數據中出現次數最多的分類,做爲新數據的分類。.net
咱們已經知道k-近鄰算法根據特徵比較,而後提取樣本集中特徵最類似數據(最鄰近)的分類標籤。3d
那麼,如何進行比較呢?好比,咱們仍是以表1.1爲例,怎麼判斷紅色圓點標記的電影所屬的類別呢? 以下圖所示。rest
咱們能夠從散點圖大體推斷,這個紅色圓點標記的電影可能屬於動做片,由於距離已知的那兩個動做片的圓點更近。code
k-近鄰算法用什麼方法進行判斷呢?沒錯,就是距離度量。這個電影分類的例子有2個特徵,也就是在2維實數向量空間,htm
可使用咱們高中學過的兩點距離公式計算距離,如圖1.2所示。blog
經過計算可知,紅色圓點標記的電影到動做片 (108,5)的距離最近,爲16.55。
若是算法直接根據這個結果,判斷該紅色圓點標記的電影爲動做片,這個算法就是最近鄰算法,
而非k-近鄰算法。那麼k-近鄰算法是什麼呢?k-近鄰算法步驟以下:
好比,如今我這個k值取3,那麼在電影例子中,按距離依次排序的三個點分別是動做片(108,5)、動做片(115,8)、愛情片(5,89)。
在這三個點中,動做片出現的頻率爲三分之二,愛情片出現的頻率爲三分之一,因此該紅色圓點標記的電影爲動做片。這個判別過程就是k-近鄰算法。
(1) 準備數據集合
對於表1.1中的數據,咱們可使用numpy直接建立,代碼以下:
結果以下
(2)k-近鄰算法
根據兩點距離公式,計算距離,選擇距離最小的前k個點,並返回分類結果。
輸出結果:
group [[ 1 101] [ 5 89] [108 5] [115 8]] labels ['愛情片', '愛情片', '動做片', '動做片'] datasetsize 4 diffmat [[100 -81] [ 96 -69] [ -7 15] [-14 12]] sqdiffmat [[10000 6561] [ 9216 4761] [ 49 225] [ 196 144]] sqdistances [16561 13977 274 340] distances [ 128.68954892 118.22436297 16.55294536 18.43908891] sortedDistIndices [2 3 1 0] voteIlabel 0 動做片 classCount[voteIlabel] 1 voteIlabel 1 動做片 classCount[voteIlabel] 2 voteIlabel 2 愛情片 classCount[voteIlabel] 1 sortedClassCount [('動做片', 2), ('愛情片', 1)] 動做片
由 模型可知, 當數據爲[101,20] ,數據數據可能爲動做片
參考資料
https://cuijiahua.com/blog/2017/11/ml_1_knn.html
https://www.cnblogs.com/bonelee/p/8036024.html
https://blog.csdn.net/u011475210/article/details/77770751