k近鄰法原理及程式設計實現

2021-10-05 23:56:41 字數 3375 閱讀 6628

給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的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...