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

2022-09-20 06:18:12 字數 2216 閱讀 8027

一、knn(k-nearest neighbor)演算法原理

事物都遵循物以類聚的思想,即有相同特性的事物在特徵空間分布上會靠得更近,所以knn的思路是:乙個樣本在特徵空間中k個靠的最近的樣本中,大多數屬於某個類別,這個樣本就屬於某個類別。

如圖所示,藍色方框和橙色三角分別代表不同的類別,此時來了乙個未知類別的樣本綠色圓,如何判斷綠圓的類別,步驟如下:

計算綠圓和特徵空間中的每乙個點的距離。

設定k的值。

選取與當前綠圓距離最近的k個點。

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

返回出現頻率最高的類別作為綠圓的**類別。

如果k=3,則距離綠圓最近的三個點是黑色實線圓圈裡的點,而橙色三角個數最多,故判斷綠圓的類別是橙色三角。

如果k=5,則距離綠圓最近的5個點是黑色虛線圓圈裡的點,此時藍色方框個數最多,故判斷綠圓的類別是藍色方框。

樣本點之間距離的一般使用歐氏距離來計算:

二、knn演算法python實現

計算各向量點之間的距離

選擇距離最小的k個點

統計k個點中的類別,並從大到小排序

返回出現頻率最高的類別

目前座標中有兩個黃點類和兩個紫點類,需要判斷藍點屬於哪個類別?

#將inx重複datasetsize行,便於做向量計算

diffmat = tile(inx, (datasetsize, 1)) -dataset

sqdiffmat = diffmat ** 2sqdistinces = sqdiffmat.sum(axis=1)

distinces = sqdistinces ** 0.5

#以上求向量點之間的歐氏距離

#從小到大返回距離的索引值

sorteddistindicies =distinces.argsort()

#建立乙個字典,用來存放類別和出現的頻次

classcount ={}

for i in

range(k):

voteilabel =labels[sorteddistindicies[i]]

classcount[voteilabel] = classcount.get(voteilabel, 0) + 1

#classcount.iteritems()=

#用classcount中iteritems的第二項作為比較的數值(類別的統計頻次),然後對iteritems逆序排序

sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true)

return

sortedclasscount[0][0]

defcreatedataset():

group = array([[10, 11], [9, 8], [2, 3], [3, 1]])

labels = ['

a', '

a', '

b', 'b'

]

return

group, labels

if__name__ == '

__main__':

group, labels =createdataset()

classlabel = classify0([3.5, 2], group, labels, 3)

print

"the classifier came back with: %c

" % classlabel

返回的結果是:

the classifier came back with: b

機器學習之 K近鄰演算法(KNN)

k近鄰演算法是機器學習中的最基礎的演算法之一,也是必須會講解的演算法之一。因為其簡單,易懂。但是k近鄰演算法在實際應用中卻很少使用到,由於其侷限性很強,執行效率低下。那麼所謂的k近鄰中的近鄰是指 已有乙個訓練資料集,現給定乙個新的資料,利用現有資料集對其進行 那麼 方法便是尋找與給定資料距離最近的k...

機器學習 KNN最近鄰演算法

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

機器學習 k 近鄰 kNN 演算法

一 基本原理 存在乙個樣本資料集合 也稱訓練樣本集 並且樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料 最近鄰 的分類標籤。我們一般只選擇樣本集中前k k通常是不大於20的整數 個最相似的資料,最後選擇k個...