機器學習 KNN(最近鄰)詳解

2021-10-06 19:28:11 字數 3717 閱讀 3850

k-近鄰演算法原理

k最近鄰(knn,k-nearestneighbor)分類演算法,見名思意:找到最近的k個鄰居(樣本),在前k個樣本中選擇頻率最高的類別作為**類別。

下面舉個例子,**一下大家就會顯而易見了,如下圖:

e.g:下圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果k=3,由於紅色三角形所佔比例為2/3,綠色圓將被賦予紅色三角形那個類,如果k=5,由於藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。

我們的目的是要**某個學生在數學課上的成績。。。

先來說明幾個基本概念:圖中每個點代表乙個樣本(在這裡是指乙個學生),橫縱座標代表了特徵(到課率,作業質量),不同的形狀代表了類別(即:紅色代表a(優秀),綠色代表d(不及格))。我們現在看(10,20)這個點,它就代表著:在數學課上,某個學生到課率是10%,交作業質量是20分,最終導致了他期末考試得了d等級(不佳)。同理,這6個點也就代表了6個往屆學生的平時狀態和最終成績,稱之為訓練樣本。。。。

現在要來實現我們的**目的了,想象一下現在一學期快過完了,張三同學馬上要考試了,他想知道自己能考的怎麼樣,他在數學老師那裡查到了自己的到課率85%,作業質量是90,那麼怎麼實現**呢?張三可以看做是(85,90)這個點–也被稱之為測試樣本,首先,我們計算張三到其他6位同學(訓練樣本)的距離,點到點的距離相信我們初中就學了吧(一般用的歐氏距離)。再選取前k個最近的距離,例如我們選擇k=3,那麼我們就找出距離最近的三個樣本分別屬於哪個類別,此例中,自然三個都是a等,所以可**出張三的數學期末成績可能是a等(優秀)。倘若李四現在也想進行**,據他較近的3個中兩個d,乙個a,那麼李四的數學期末成績被**為d。這也就是最開始所說的:在前k個樣本中選擇頻率最高的類別作為**類別。。。

總結其計算步驟如下:

算距離:給定測試物件,計算它與訓練集中的每個物件的距離

找鄰居:圈定距離最近的k個訓練物件,作為測試物件的近鄰

做分類:根據這k個近鄰歸屬的主要類別,來對測試物件分類

好了,經過上述過程,你是否對knn演算法基本思想有了一定了解。也許你會問我,我大學不去上課,不交作業,照樣考a,這**根本不準確嘛,o(∩_∩)o哈哈~,首先說明一下這個例子舉的確實不太恰當,因為我們的特徵(到課率和作業質量)選取的不當,在很多分類**演算法中,決定其分類**上限的往往是好的特徵的選取,好的特徵也就是對其最終結果的影響比較大的。。。原理就說到這吧。。。

演算法複雜度

knn是一種lazy-learning演算法,分類器不需要使用訓練集進行訓練,因此訓練時間複雜度為0;knn分類的計算複雜度和訓練集中的文件數目成正比,也就是說,如果訓練集中文件總數為n,那麼knn的分類時間複雜度為o(n);因此,最終的時間複雜度是o(n)。

k-近鄰的優缺點

knn演算法的優點:

1)簡單、有效。

2)重新訓練的代價較低(類別體系的變化和訓練集的變化,在web環境和電子商務應用中是很常見的)。

3)計算時間和空間線性於訓練集的規模(在一些場合不算太大)。

4)由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,knn方法較其他方法更為適合。

5)該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。

knn演算法缺點:

1)knn演算法是懶散學習方法(lazy learning,基本上不學習),一些積極學習的演算法要快很多。

2)類別評分不是規格化的(不像概率評分)。

3)輸出的可解釋性不強,例如決策樹的可解釋性較強。

4)該演算法在分類時有個主要的不足是,當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的k個鄰居中大容量類的樣本占多數。該演算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響執行結果。可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。

5)計算量較大。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。

3.1 首先我們介紹一下**實現步驟:

計算已知類別資料集中的點與當前點之間的距離

按距離遞增次序排序

選取與當前點距離最小的k個點

統計前k個點所在的類別出現的頻率

返回前k個點出現頻率最高的類別作為當前點的**分類

3.2 實現:我們先建立乙個名為knn.py的檔案,整體實現**如下:

from numpy import

*#匯入numpy科學計算包

import operator #匯入運算子模組

#載入資料的方法,返回樣本資料(每一行是乙個樣本)和樣本標籤

defcreatedataset()

: group = array([[

90,100],[

88,90]

,[85,

95],[

10,20]

,[30,

40],[

50,30]

])#樣本點資料

labels =

['a'

,'a'

,'a','d','d'

,'d'

]return group,labels

#分類方法 傳入的dataset需是array陣列

defclassify0

(inx, dataset, labels, k)

:#inx為輸入樣本,例如[85,90]

datasetsize = dataset.shape[0]

#求出輸入資料矩陣的行數(樣本個數)

diffmat = tile(inx,

(datasetsize,1)

)- dataset #求矩陣差

sqdiffmat = diffmat **

2

sqdistance = sqdiffmat.

sum(axis =1)

#平方和

distance = sqdistance **

0.5#測試樣本點距離每個樣本點的距離

sorteddistance = distance.argsort(

)#將距離按公升序排列

classcount =

for i in

range

(k):

votelabel = labels[sorteddistance[i]

]#遍歷前k個樣本的標籤

classcount[votelabel]

= classcount.get(votelabel,0)

+1#對標籤進行計數,即每一類出現的次數

sortedclasscount =

sorted

(classcount.items(

),key = operator.itemgetter(1)

,reverse =

true

)#將計數後的標籤按降序進行排列,得到元組列表

return sortedclasscount[0][0]

機器學習 KNN最近鄰演算法

k近鄰 k nearest neighbor,knn 可以做分類,也可以做回歸。一 基本思想 給定一組訓練集,有乙個需要判斷類別的輸入例項,離輸入例項最近的k個訓練資料屬於哪個類別,就判斷輸入例項屬於哪個類別。二 分類演算法描述 1 計算輸入例項和所有訓練集資料的距離 2 按距離公升序排序 3 選擇...

機器學習 最近鄰策略 k means和KNN

假設我們已經利用一堆樣本進行了訓練,得到了k個分類和k個分類的重心,那麼對於待測資料x 計算x 到k個分類重心的距離,距離最近的分類y 即為x 的分類。這是最近鄰策略的基本思路,從中衍生了k means和knn方法。如何度量距離是乙個複雜的問題,一般情況下我們習慣使用歐氏距離來表徵分類距離。如果我們...

機器學習之k 最近鄰(kNN)演算法

一 knn k nearest neighbor 演算法原理 事物都遵循物以類聚的思想,即有相同特性的事物在特徵空間分布上會靠得更近,所以knn的思路是 乙個樣本在特徵空間中k個靠的最近的樣本中,大多數屬於某個類別,這個樣本就屬於某個類別。如圖所示,藍色方框和橙色三角分別代表不同的類別,此時來了乙個...