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

2021-08-22 14:49:32 字數 1462 閱讀 4693

參考文章:

對參考文章中最後一部分說的有問題的地方進行了修改。

權值加權:為每個點的距離增加乙個權重,使得距離近的點可以得到更大的權重,在此描述如何加權。

該方法最簡單的形式是返回距離的倒數,比如距離d,權重1/d。有時候,完全一樣或非常接近的商品權重會很大甚至無窮大。基於這樣的原因,在距離求倒數時,在距離上加乙個常量:

weight = 1 / (distance + const)

這種方法的潛在問題是,它為近鄰分配很大的權重,稍遠一點的會衰減的很快。雖然這種情況是我們希望的,但有時候也會使演算法對雜訊資料變得更加敏感。

高斯函式比較複雜,但克服了前述函式的缺點,其形式:

其中a,b,c∈r

高斯函式的圖形在形狀上像乙個倒懸著的鐘。a是曲線的高度,b是曲線中心線在x軸的偏移,c是半峰寬度(函式峰值一半處相距的寬度)。

半峰寬度

上面的高斯函式在距離為0的時候權重為1,隨著距離增大,權重減少,但不會變為0。下圖是高斯函式和其它幾個函式的區別,其它函式在距離增大到一定程度時,權重都跌至0或0以下。

加權knn首先獲得經過排序的距離值,再取距離最近的k個元素。

1.在處理離散型資料時,將這k個資料用權重區別對待,**結果與第n個資料的label相同的概率:

將各個類**的權重值相加,哪個類最大,就屬於哪個類。

f(x) = wi屬於類x / wi總和      i=1,2,...,k

2.在處理數值型資料時,並不是對這k個資料簡單的求平均,而是加權平均:通過將每一項的值乘以對應權重,然後將結果累加。求出總和後,除以所有權重之和。

f(x) = wi*vi總和 / wi總和  i=1,2,...,k

vi代表近鄰i的值,wi代表其權重,f(x)是**的數值型結果。每**乙個新樣本的所屬類別時,都會對整體樣本進行遍歷,可以看出knn的效率實際上是十分低下的。

關於knn中高斯加權歐式距離的問題

在knn分類演算法中,需要計算待測樣本和它周圍鄰居之間的距離,從而選擇最近的k個鄰居的類別情況作為依據,來判斷待測樣本的分類。最常見的兩點之間或多點之間的距離表示法是歐氏距離,那麼怎麼算高斯加權歐式距離?看網上有人說就是直接在歐氏距離前面乘以乙個高斯權重,可我有個疑問,高斯權重是隨著歐式距離的增大而...

k最鄰近演算法 加權kNN

上篇文章中提到為每個點的距離增加乙個權重,使得距離近的點可以得到更大的權重,在此描述如何加權。該方法最簡單的形式是返回距離的倒數,比如距離d,權重1 d。有時候,完全一樣或非常接近的商品權重會很大甚至無窮大。基於這樣的原因,在距離求倒數時,在距離上加乙個常量 weight 1 distance co...

KNN演算法優化

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