KNN(k 近鄰)演算法簡單實現

2021-09-11 08:29:14 字數 2914 閱讀 8612

knn是通過測量不同特徵值之間的距離進行分類。它的思路是:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,其中k通常是不大於20的整數。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。

下面通過乙個簡單的例子說明一下:如下圖,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果k=3,由於紅色三角形所佔比例為2/3,綠色圓將被賦予紅色三角形那個類,如果k=5,由於藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。

由此可以看出knn演算法的結果很大程度上取決於k的選擇。

在knn中,通過計算物件距離來作為各個物件之間的非相似性指標,避免了物件之間的匹配問題,在這裡距離一般使用歐氏距離或曼哈頓距離:

歐 氏距

離:d(

x,y)

=∑k=

1n(x

k−yk

)2歐氏距離:d(x,y)=\sqrt^n(x_k-y_k)^2}

歐氏距離:d

(x,y

)=k=

1∑n​

(xk​

−yk​

)2​曼哈頓

距離:d

(x,y

)=∑k

=1n∣

xk−y

k∣曼哈頓距離:d(x,y)=\sqrt^n\left|x_k-y_k\right|}

曼哈頓距離:

d(x,

y)=k

=1∑n

​∣xk

​−yk

​∣​就是在訓練集中資料和標籤已知的情況下,輸入測試資料,將測試資料的特徵與訓練集中對應的特徵進行相互比較,找到訓練集中與之最為相似的前k個資料,則該測試資料對應的類別就是k個資料**現次數最多的那個分類,其演算法的描述為:

(1) 計算測試資料與各個訓練資料之間的距離;

(2) 按照距離的遞增關係進行排序;

(3) 選取距離最小的k個點;

(4) 確定前k個點所在類別的出現頻率;

(5) 返回前k個點**現頻率最高的類別作為測試資料的**分類。

#-*- coding:utf-8 -*-

from numpy import

*import operator

#給出訓練資料以及對應的類別

defcreatedataset()

: group = array([[

1.0,

1.1],[

1.0,

1.0],[

0,0]

,[0,

0.1]])

labels =

['a'

,'a'

,'b'

,'b'

]return group, labels

#通過knn進行分類

defclassify

(input

, dataset, label, k)

: datasize = dataset.shape[0]

#tile在列向量方向上重複input共1次(橫向),行向量方向上重複input共datasetsize次(縱向)

diff = tile(

input

,(datasize,1)

)- dataset

sqdiff = diff **

2 squaredist =

sum(sqdiff, axis=1)

#每一行的元素加到第一列,得到乙個新的行向量

dist = squaredist **

0.5#對距離進行排序

sorteddistindex = argsort(dist)

#argsort()從小到大排序,返回下標

classcount =

for i in

range

(k):

#取出前k個元素的類別

votelabel = label[sorteddistindex[i]

]#對距離最近的k個樣本所屬類別進行統計

#dict.get(key,default=none),字典的get()方法,返回指定鍵的值,如果值不在字典中返回預設值。

classcount[votelabel]

= classcount.get(votelabel,0)

+1#python3中用items()替換python2中的iteritems()

#key=operator.itemgetter(1)根據字典的值進行排序

#key=operator.itemgetter(0)根據字典的鍵進行排序

#reverse降序排序字典

sortedclasscount =

sorted

(classcount.items(

),key=operator.itemgetter(1)

,reverse=

true

)#返回次數最多的類別,即所要分類的類別

return sortedclasscount[0]

[0]if __name__ ==

'__main__'

: dataset,labels = createdataset(

)input

= array([0

,0.3])

k =3 output = classify(

input

,dataset,labels,k)

print

("測試資料為:"

,input

,"分類結果為:"

,output)

KNN K近鄰 演算法 簡單實現

k近鄰 knn,k nearestneighbor 分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。cover和hart在1968年提出了最初的鄰近演算法。knn是一種分類 classification 演算法,它...

TensorFlow實現knn(k近鄰)演算法

首先先介紹一下knn的基本原理 knn是通過計算不同特徵值之間的距離進行分類。整體的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。k通常是不大於20的整數。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策...

KNN k近鄰演算法

現在假如我們已經擁有了一些資料 稱為訓練資料集 ts,並且擁有所有資料的類別名 即每條資料應該歸於哪個類別。當我們要判斷一條不知類別的資料時,首先讓這條資料m和已經擁有的所有的資料ts中的每一條資料進行比較,然後根據比較結果選擇出和m最相似 一般是基於距離 的k條資料 k是個整數,並且通常是小於20...