knn(k nearest neighbors)演算法,也叫k最近鄰演算法。主要思想是,如果乙個樣本在特徵空間中的k個最相似(或最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。
例如,村里投票建水井,有三個選址a, b和c,所有的人家都投了票,除了李四家。村書記決定找出距李四家最近的6戶人家,發現3戶投了b,2戶投了a,1戶投了c。於是村書記決定給李四家的投票結果標記為b。
問題的一般化:有n個已標記樣本,
,現需要對新來的資料xn
+1做標記。
knn演算法的思路:找出n個樣本裡離xn
+1最近的k個樣本,統計這k個樣本裡類別yi
出現次數最多的樣本,將新樣本xn
+1標記為yi
類。有a, b, c, d四個座標點,其座標分別為:a(1,1.1),b(1,1),c(0,0.1),c(0,0)。其中a和b兩個點標記為紅色類,記為r類;c和d兩個點標記為綠色類,標記為g類。現在另有乙個點e(0.2, 0.2),圖中用藍色標記。請問點e屬於r類還是g類?
輸入的樣本:
需要得到的結果:點e
(0.2
,0.2
) 的類別
演算法的偽**:
1. 分別計算點e到點a, b, c, d的距離: re
a , re
b , re
c , re
d .
2. 將這四個距離值由小到大排序,re
c d
b a
3. 假定k=
3 ,則距離e點最近的三個點依次為:c, d, b
4. 統計這三個點的類別,分別為:g, g, r。即g類出現2次,r類出現1次。統計列表為
5. 輸出點e的類別:g。即點e屬於綠色類g。
#!/usr/bin/env python
from numpy import *
import operator
defcreatedataset
():#輸入帶標記的樣本
group = array([[1.0,1.1], [1.0,1.0],[0,0],[0,0.1]])
labels = ['r','r','g','g']
return group, labels
#use knn to classify
defclassify
(input, dataset, label, k):
#input是待分類的樣本,這裡是點e的座標;dataset是帶標記樣本,即createdataset()返回的group;label是createdataset()返回的labels,k是設定的值,找最近的k個鄰居
datasize = dataset.shape[0] #array.shap[0]返回矩陣array的行數
#calculate the distance
diff = tile(input, (datasize,1)) - dataset # 參見tile函式的用法
sqdiff = diff ** 2
# 算diff的平方
squaredist = sum(sqdiff, axis=1) #將矩陣的每一行相加
dist = squaredist ** 0.5
# 開平方
#sort the distance
sorteddistindex = argsort(dist) # 將dist按公升序排序,返回其下標
classcount = {} # 建立字典classcount
for i in range(k):
votelabel = label[sorteddistindex[i]] # 通過下標找到對應的label
classcount[votelabel] = classcount.get(votelabel,0) + 1
# 將label對應的計數加一,沒找到label就置預設值0
maxcount = 0
# 統計出現次數最多的類別
for key,value in classcount.items():
if value > maxcount:
maxcount = value
classes = key
return classes
group, labels = createdataset()
input = array([0.2,0.2])
output = classify(input, group, labels, 3)
print("input is:", input, "result is:", output)在命令列中輸入:python knn.py
輸出結果:
(『input is:』array([0.2, 0.2]), 『result is:』, 『g』)
輸入矩陣[0.2,0.2]
datasize=4為樣本dataset=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
的行數
將[0.2,0.2]在行的緯度上重複4次,變成array([[0.2,0.2],[0.2,0.2],[0.2,0.2],[0.2,0.2]])
得到diff=array([[-0.8,-0.9],[-0.8,-0.8],[0.2,0.2],[0.2,0.1]])
sqdiff=array([[0.64,0.81],[0.64,0.64],[0.04,0.04],[0.04,0.01]])
squaredist=array([1.45,1.28,0.08,0.05])
dist=array([1.2,1.13,0.28,0.22])
sorteddistindex=array([3,2,1,0])
classcount =
結果返回g
。
機器學習實戰 1 K近鄰
1.np.tile array,行重複次數,列重複次數 a np.array 1,2,3 b np.tile a,2,3 b 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 2.array.sum axis 0 1 0 每列求和 1 沒行求和 3.array.argsort ...
機器學習實戰筆記1 K近鄰演算法詳解
最近在看 機器學習實戰 這本書,書中的 都是對某種演算法在對應應用場景的實現,感覺比大學時代的資料結構或者演算法題還要晦澀難懂,只能慢慢學習了,演算法這種東西類似做數學題,要多做多練。k 近鄰演算法乙個典型的應用場景就是在區別電影類別中,比如說根據在電影片段中出現親吻,打 鬥場景來判斷電影是否是愛情...
機器學習實戰 KNN演算法(K近鄰)
演算法實現 演算法應用舉例 k近鄰演算法是機器學習最簡單的演算法之一,也是機器學習的初步,其主要通過大量的資料分析,判斷一組未知資料和各資料的距離,從而對一組未知資料進行相應的歸類。而所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。所以knn演算法並不是十分完...