在之前所寫的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 ...