KNN演算法介紹

2021-09-08 13:03:21 字數 4205 閱讀 4292

knn演算法全名為k-nearest neighbor,就是k最近鄰的意思。

knn是一種分類演算法,其基本思想是採用測量不同特徵值之間的距離方法進行分類。

演算法過程如下:

1、準備樣本資料集(樣本中每個資料都已經分好類,並具有分類標籤);

2、使用樣本資料進行訓練;

3、輸入測試資料a;

4、計算a與樣本集的每乙個資料之間的距離;

5、按照距離遞增次序排序;

6、選取與a距離最小的k個點;

7、計算前k個點所在類別的出現頻率;

8、返回前k個點出現頻率最高的類別作為a的**分類。

訓練集(或樣本資料)

訓練集太小會誤判,訓練集太大時對測試資料分類的系統開銷會非常大。

距離(或相似的衡量演算法)

什麼是合適的距離衡量?距離越近應該意味著這兩個點屬於乙個分類的可能性越大。

距離衡量包括:

1、歐氏距離

歐幾里得度量(euclidean metric)(也稱歐氏距離)是乙個通常採用的距離定義,指在m維空間中兩個點之間的真實距離,或者向量的自然長度(即該點到原點的距離)。在二維和三維空間中的歐氏距離就是兩點之間的實際距離。

適用於空間問題。

2、曼哈頓距離

計程車幾何或曼哈頓距離(manhattan distance)是由十九世紀的赫爾曼·閔可夫斯基所創詞彙 ,是種使用在幾何度量空間的幾何學用語,用以標明兩個點在標準座標系上的絕對軸距總和。 曼哈頓距離是歐氏距離在歐幾里得空間的固定直角座標系上所形成的線段對軸產生的投影的距離總和。

圖中紅線代表曼哈頓距離,綠色代表歐氏距離,也就是直線距離,而藍色和黃色代表等價的曼哈頓距離。 曼哈頓距離——兩點在南北方向上的距離加上在東西方向上的距離,即d(i,j)=|xi-xj|+|yi-yj|。

適用於路徑問題。

3、切比雪夫距離

在數學中,切比雪夫距離是向量空間中的一種度量,二個點之間的距離定義是其各座標數值差絕對值的最大值。

切比雪夫距離會用在計算法網格中兩點之間的距離,比如:棋盤、倉儲物流等應用。

對乙個網格,和乙個點的切比雪夫距離為1的點為此點的moore型鄰居(英語:moore neighborhood)。

使用於在網格中計算距離的問題。

4、閔可夫斯基距離(minkowski distance)

閔氏距離不是一種距離,而是一組距離的定義。

根據變引數的不同,閔氏距離可以表示一類的距離。

其公式中有乙個變參p:

當p=1時,是曼哈頓距離;

當p=2時,是歐氏距離;

當p→∞時,就是切比雪夫距離。

5、標準化歐氏距離 (standardized euclidean distance )

標準化歐氏距離是針對簡單歐氏距離的缺點而作的一種改進方案,可以看成是一種加權歐氏距離。

標準歐氏距離的思路: 既然資料各維分量的分布不一樣,那先將各個分量都「標準化」到均值、方差相等。

6、馬氏距離(mahalanobis distance)

表示資料的協方差距離。

它是一種有效的計算兩個未知樣本集的相似度的方法。

量綱無關,可以排除變數之間的相關性的干擾。

7、巴氏距離(bhattacharyya distance) 在統計學中,巴氏距離用於測量兩離散概率分布。它常在分類中測量類之間的可分離性。

8、漢明距離(hamming distance)

兩個等長字串s1與s2之間的漢明距離定義為將其中乙個變為另外乙個所需要作的最小替換次數。

例如字串「1111」與「1001」之間的漢明距離為2。

應用:資訊編碼(為了增強容錯性,應使得編碼間的最小漢明距離盡可能大)。

9、夾角余弦(cosine)

幾何中夾角余弦可用來衡量兩個向量方向的差異,資料探勘中可用來衡量樣本向量之間的差異。

10、傑卡德相似係數(jaccard similarity coefficient)

傑卡德距離用兩個集合中不同元素佔所有元素的比例來衡量兩個集合的區分度。

可將傑卡德相似係數用在衡量樣本的相似度上。

11、皮爾森相關係數(pearson correlation coefficient)

皮爾森相關係數,也稱皮爾森積矩相關係數(pearson product-moment correlation coefficient) ,是一種線性相關係數。 皮爾森相關係數是用來反映兩個變數線性相關程度的統計量。

高維度對距離衡量的影響:

當變數數越多,歐式距離的區分能力就越差。

變數值域對距離的影響:

值域越大的變數常常會在距離計算中佔據主導作用,因此應先對變數進行標準化。

k的大小

k太小,分類結果易受雜訊點影響,誤差會增大;

k太大,近鄰中又可能包含太多的其它類別的點(對距離加權,可以降低k值設定的影響);

k=n(樣本數),則完全不足取,因為此時無論輸入例項是什麼,都只是簡單的**它屬於在訓練例項中最多的類,模型過於簡單,忽略了訓練例項中大量有用資訊。

在實際應用中,k值一般取乙個比較小的數值,例如採用交叉驗證法(簡單來說,就是一部分樣本做訓練集,一部分做測試集)來選擇最優的k值。

經驗規則:k一般低於訓練樣本數的平方根。

1、優點

簡單,易於理解,易於實現,精度高,對異常值不敏感。

2、缺點

knn是一種懶惰演算法,構造模型很簡單,但在對測試資料分類的系統開銷大(計算量大,記憶體開銷大),因為要掃瞄全部訓練樣本並計算距離。

數值型和標稱型(具有有窮多個不同值,值之間無序)。

比如客戶流失**、欺詐偵測等。

這裡以python為例描述下基於歐氏距離的knn演算法實現。

歐氏距離公式:

以歐氏距離為例的示例**:

#

! /usr/bin/env python

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

#e-mail : [email protected]

import

math

class

knn:

def__init__

(self,traindata,trainlabel,k):

self.traindata =traindata

self.trainlabel =trainlabel

self.k =k

defpredict(self,inputpoint):

retlable = "

none

"arr=

for vector,lable in

zip(self.traindata,self.trainlabel):

s =0

for i,n in

enumerate(vector) :

arr = sorted(arr,key=lambda

x:x[0])[:self.k]

dtmp ={}

for k,v in

arr :

ifnot v in dtmp : dtmp[v]=0

dtmp[v] += 1retlable,_ = sorted(dtmp.items(),key=lambda x:x[1],reverse=true)[0]

return

retlable

data =[

[1.0, 1.1],

[1.0, 1.0],

[0.0, 0.0],

[0.0, 0.1],

[1.3, 1.1],

]labels = ['

a','

a','

b','

b','a'

]knn = knn(data,labels,3)

print knn.predict([1.2, 1.1])

print knn.predict([0.2, 0.1])

上面的實現比較簡單,在開發中可以使用現成的庫,比如scikit-learn :

好,就這些了,希望對你有幫助。

演算法介紹.md

歡迎補充 

KNN演算法介紹

knn演算法全名為k nearest neighbor,就是k最近鄰的意思。knn是一種分類演算法,其基本思想是採用測量不同特徵值之間的距離方法進行分類。演算法過程如下 1 準備樣本資料集 樣本中每個資料都已經分好類,並具有分類標籤 2 使用樣本資料進行訓練 3 輸入測試資料a 4 計算a與樣本集的...

KNN演算法簡單介紹

鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法是 資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別...

KNN演算法 鄰近演算法

knn演算法是機器學習裡面比較簡單的乙個分類演算法了,整體思想比較簡單 計算乙個點a與其他所有點之間的距離,取出與該點最近的k個點,然後統計這k個點裡面所屬分模擬例最大的,則點a屬於該分類。這樣講可能還有點迷糊,下面用乙個例子來說明一下 電影名稱 打鬥次數 接吻次數 電影型別 california ...