k最近鄰算法(KNN)的簡介和python實現

一、算法要點

1、指導思想

kNN算法的指導思想是“近朱者赤,近墨者黑”,由你的鄰居來推斷出你的類別。如果一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 kNN方法在類別決策時,只與極少量的相鄰樣本有關。由於kNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,kNN方法較其他方法更爲適合。

用於推薦時:

這裏我們不用KNN來實現分類,我們使用KNN最原始的算法思路,即爲每個內容尋找K個與其最相似的內容,並推薦給用戶


計算步驟如下:
    1)算距離:給定測試對象,計算它與訓練集中的每個對象的距離。
    2)找鄰居:圈定距離最近的k個訓練對象,作爲測試對象的近鄰
    3)做分類:根據這k個近鄰歸屬的主要類別,來對測試對象分類

2、距離或相似度的衡量
什麼是合適的距離衡量?距離越近應該意味着這兩個點屬於一個分類的可能性越大。
覺的距離衡量包括歐式距離、夾角餘弦等。
對於文本分類來說,使用餘弦(cosine)來計算相似度就比歐式(Euclidean)距離更合適。

3、類別的判定
投票決定:少數服從多數,近鄰中哪個類別的點最多就分爲該類。
加權投票法:根據距離的遠近,對近鄰的投票進行加權,距離越近則權重越大(權重爲距離平方的倒數)

二、優缺點

1、優點
簡單,易於理解,易於實現,無需估計參數,無需訓練
適合對稀有事件進行分類(例如當流失率很低時,比如低於0.5%,構造流失預測模型)
特別適合於多分類問題(multi-modal,對象具有多個類別標籤),例如根據基因特徵來判斷其功能分類,kNN比SVM的表現要好

2、缺點
懶惰算法,對測試樣本分類時的計算量大,內存開銷大,評分慢
可解釋性較差,無法給出決策樹那樣的規則。

三、常見問題


1、k值設定爲多大?
k太小,分類結果易受噪聲點影響;k太大,近鄰中又可能包含太多的其它類別的點。(對距離加權,可以降低k值設定的影響)
k值通常是採用交叉檢驗來確定(以k=1爲基準)
經驗規則:k一般低於訓練樣本數的平方根

2、類別如何判定最合適?
投票法沒有考慮近鄰的距離的遠近,距離更近的近鄰也許更應該決定最終的分類,所以加權投票法更恰當一些。

3、如何選擇合適的距離衡量?
高維度對距離衡量的影響:衆所周知當變量數越多,歐式距離的區分能力就越差。
變量值域對距離的影響:值域越大的變量常常會在距離計算中佔據主導作用,因此應先對變量進行標準化。

4、訓練樣本是否要一視同仁?
在訓練集中,有些樣本可能是更值得依賴的。
可以給不同的樣本施加不同的權重,加強依賴樣本的權重,降低不可信賴樣本的影響。

5、性能問題?
kNN是一種懶惰算法,平時不好好學習,考試(對測試樣本分類)時才臨陣磨槍(臨時去找k個近鄰)。
懶惰的後果:構造模型很簡單,但在對測試樣本分類地的系統開銷大,因爲要掃描全部訓練樣本並計算距離。
已經有一些方法提高計算的效率,例如壓縮訓練樣本量等。

6、能否大幅減少訓練樣本量,同時又保持分類精度?
濃縮技術(condensing)

編輯技術(editing)


深入瞭解可看從K近鄰算法、距離度量談到KD樹、SIFT+BBF算法

這裏包括各種計算方法的距離和一些算法的改進。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章