KNN演算法優化

2021-08-31 04:01:27 字數 1409 閱讀 6873

在之前所寫的knn演算法python實現裡,knn對k的選取很敏感,因為它給所有的近鄰分配相同權重,無論距離測試樣本有多遠。為了降低該敏感性,可以使用加權knn,給更近的近鄰分配更大的權重,給較遠的樣本權重相應減少。gaussian函式可以實現這一點,如下圖所示。

python實現**:

def gaussian(dist, sigma = 10.0):

""" input a distance and return it`s weight"""

weight = np.exp(-dist**2/(2*sigma**2))

return weight

### 加權knn

def weighted_classify(input, dataset, label, k):

datasize = dataset.shape[0]

diff = np.tile(input, (datasize, 1)) - dataset

sqdiff = diff**2

squaredist = np.array([sum(x) for x in sqdiff])

dist = squaredist**0.5

#print(input, dist[0], dist[1164])

sorteddistindex = np.argsort(dist)

classcount = {}

for i in range(k):

index = sorteddistindex[i]

votelabel = label[index]

weight = gaussian(dist[index])

#print(index, dist[index],weight)

## 這裡不再是加一,而是權重*1

classcount[votelabel] = classcount.get(votelabel, 0) + weight*1

maxcount = 0

#print(classcount)

for key, value in classcount.items():

if value > maxcount:

maxcount = value

classes = key

return classes

下面為分別用knn和加權knn執行k=[3,4,5]的準確率。相比於knn,可以發現加權knn在k=3和k=4有一樣的結果,說明加權knn能夠緩解對k值選取的敏感。

KNN的優化演算法1 距離加權

參考文章 對參考文章中最後一部分說的有問題的地方進行了修改。權值加權 為每個點的距離增加乙個權重,使得距離近的點可以得到更大的權重,在此描述如何加權。該方法最簡單的形式是返回距離的倒數,比如距離d,權重1 d。有時候,完全一樣或非常接近的商品權重會很大甚至無窮大。基於這樣的原因,在距離求倒數時,在距...

KNN的優化演算法2 KD tree

傳統knn缺點 資料量特別大時,需要計算參考點和每個樣本點的距離,計算量非常大,所以提出一種優化演算法 kd tree.為了提高knn搜尋的效率,可以考慮使用特殊的結構儲存訓練資料,以減小計算距離的次數。kd樹 k dimension tree 是一種對k維空間中的例項點進行儲存以便對其進行快速檢索...

KNN演算法 鄰近演算法

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