給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。
1.距離度量
兩個例項之間的距離可以用l
pl_p
lp範數來定義,其中p可以選擇。l
pl_p
lp範數的定義為:
這裡面的x
ix_i
xi和x
jx_j
xj代表兩個例項,這兩個例項都有n個分量。
比較常用的是p=2,此時稱為歐氏距離,即:
例如x i=
(1,2
,3)x_i=(1,2,3)
xi=(1
,2,3
),xj=(
4,5,
6)x_j=(4,5,6)
xj=(4
,5,6
),則這兩個例項之間的歐氏距離為:
d is
tanc
e=(∣
1−4∣
2+∣2
−5∣2
+∣3−
6∣2)
1/2distance=(|1-4|^2+|2-5|^2+|3-6|^2)^
distan
ce=(
∣1−4
∣2+∣
2−5∣
2+∣3
−6∣2
)1/2
2.k值選擇
k選的小的話近似誤差會減小,但估計誤差會增大。
k選的大的話近似誤差會增大,估計誤差會減小。
比如k選1的話,對乙個點進行分類的時候就只找到與它距離最近的1個點就行,所找到的點的類別就是這個點的類別。但在實際情況下會有雜訊點,這時k=1就很容易分錯了。如下圖所示,○是一類,×是另一類,此時放入乙個△,直觀上覺得它屬於○這一類的概率大一些,但是由於雜訊的存在,如果k=1的話因為離△最近的是乙個×,這時就會把△分到×類,如果k=3的話就會把△分到○類。
另乙個例子如下:
在這個例子中如果k=1或k=2的話是可以正確地把△分在○類裡面的,如果k取乙個特別大的值的話△就會被錯誤地分到×中去。
3.分類決策規則
一般都是用多數表決,即離輸入例項最近的k個例項屬於哪個類別的例項數量最多那麼輸入例項就屬於哪個類別。
import numpy as np
import operator
class
knn:
def__init__
(self, point, samples, labels, k)
: self.point = point
self.samples = samples
self.labels = labels
self.k = k
defdistance
(self, lp)
:"""計算要進行分類的點與樣本之間的距離(lp範數)"""
samples_len =
len(self.samples)
subtract = np.tile(self.point,
(samples_len,1)
)- self.samples
absolute_value =
abs(subtract)
p_power = absolute_value ** lp
sum_value = p_power.
sum(axis=1)
p_norm = sum_value **(1
/lp)
return p_norm
defclassification
(self, distances)
: small_to_large_index = distances.argsort(
)# argsort函式返回的是陣列值從小到大的索引值
class_count =
for i in
range
(self.k)
: near_label = self.labels[small_to_large_index[i]
]# 統計前k個中標籤的數目
# 也就是說最後這個字典中存的是a類的有多少個,b類的有多少個
# 字典(dictionary) get() 函式返回指定鍵的值,如果值不在字典中返回預設值
class_count[near_label]
= class_count.get(near_label,0)
+1# reverse=true代表逆序排列
# key=operator.itemgetter(1)定義函式key為獲取物件的序號為1的值,也就是比較value,如果括號裡為0就是比較key
# sorted是個排序函式
# class_count.items()為字典裡面的內容
sorted_class_count =
sorted
(class_count.items(
), key=operator.itemgetter(1)
, reverse=
true
)return sorted_class_count[0]
[0]samples_out =[[
1,2]
,[3,
4],[
5,6]
,[7,
8]]labels_out =
['a'
,'a'
,'b'
,'b'
]knn = knn([0
,0], samples_out, labels_out,3)
distance_out = knn.distance(2)
classification_result = knn.classification(distance_out)
print
(classification_result)
結果為:
a
K近鄰(KNN)演算法原理及python實現
knn是乙個極其簡單的演算法,工作流程如下 距離計算公式可以使用歐幾里得距離,曼哈頓距離,閔可夫斯基距離等等,展示為了簡單使用歐幾里得距離。函式功能 knn分類器 引數說明 inx 需要 分類的樣本 dataset 已知分類標籤的資料集 訓練集 k k 近鄰演算法引數,選擇距離最小的k個點 返回 r...
k 近鄰原理
對於未知類別資料集中的點與當前點的距離 1.計算已知類別資料集中的點與當前點的距離 2.按照距離依次排序 3.選取與當前點距離最小的k個點 4.確定前k個點所在類別的出現概率 5.返回前k個點出現頻率最高的類別作為當前點 分類 概述 knn演算法本身簡單有效,它是一種lazy learning演算法...
K 最近鄰法 KNN C 實現
關於knn的介紹可以參考 這裡給出knn的c 實現,用於分類。訓練資料和測試資料均來自mnist,關於mnist的介紹可以參考 從mnist中提取的40幅影象,0,1,2,3四類各20張,每類的前10幅來自於訓練樣本,用於訓練,後10幅來自測試樣本,用於測試,如下圖 實現 如下 knn.hpp if...