【有監督分類】k-NearestNeighbor (kNN)

KNN算法思路

kNN是通過測量不同樣本之間的距離進行分類,認爲樣本可以最接近它的k個鄰居來代表。
在這裏插入圖片描述

思路

 如果一個樣本在特徵空間中的k個鄰居樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,通常k20k\leqslant20kNN算法中,所選擇的鄰居都是已經正確分類的對象。

算法過程

InputXtrainYtrainXtestInput:X_{train},Y_{train},X_{test}
Output:YtestOutput: Y_{test}

  1. 計算當前測試樣本XtestX_{test}每個訓練樣本XtrainX_{train}之間的距離
  2. 按照距離的遞增關係進行排序
  3. 選取距離最小k個點
  4. 確定前k個點的類別頻率
  5. 返回前k個點中出現頻率最高的類別作爲YtestY_{test}

優點

  1. 簡單,易實現,無需估計參數,無需訓練
  2. 適合稀有事件分類問題(例如當流失率很低時,比如低於0.5%,構造流失預測模型)
  3. 適合多分類問題,例如根據基因特徵來判斷其功能分類,kNN比SVM的表現要好

缺點

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

常見問題

k值的選取對分類的結果影響至關重要

k值較小,則模型複雜度較高,容易發生過擬合,分類結果易受噪聲點影響,學習的估計誤差會增大,預測結果對近鄰的實例點非常敏感。
k值較大,導致分類模糊,可以減少學習的估計誤差,但是學習的近似誤差會增大,與輸入實例較遠的訓練實例也會對預測起作用,使預測發生錯誤。此外,k值增大,模型的複雜度會下降。
 在應用中,k值一般取一個比較小的值(經驗規則:低於訓練樣本數的平方根),通常採用交叉驗證法來選取最優的k值,還可以用貝葉斯、bootstrap。
對距離加權,可以降低k值設定的影響。

近似誤差:模型估計值與實際值之間的差距,訓練誤差。最小化近似誤差容易過擬合。
估計誤差:模型的估計係數與實際係數之間的差距,測試/泛化誤差。最小化估計誤差,模型的泛化能力好。

距離/相似度:常用歐式距離,夾角餘弦

(1)高維度:變量數越多,歐式距離的區分能力就越差。
(2)變量值域:值域越大的變量常常會在距離計算中佔據主導作用,因此應先對變量進行標準化

《模式分類》中指出歐式距離對平移是敏感的,這點嚴重影響了判定的結果。在此必須選用一個對已知的變換(比如平移、旋轉、尺度變換等)不敏感的距離度量。書中提出了採用切空間距離(tangent distance) 來替代傳統的歐氏距離。

在這裏插入圖片描述

類別判定:加權投票法

投票法沒有考慮近鄰的距離的遠近,距離更近的近鄰也許更應該決定最終的分類,所以加權投票法更好。

訓練樣本權重

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

性能

模型很簡單,計算開銷大(因爲要掃描全部訓練樣本並計算距離)。
提高計算效率的方法:壓縮訓練樣本量等。

減少訓練樣本量,同時保持精度

濃縮技術(condensing)
編輯技術(editing)

應用:推薦系統

爲每個內容尋找k個與其最相似的內容,並推薦給用戶。

參考

https://blog.csdn.net/jmydream/article/details/8644004
https://www.cnblogs.com/lzida9223/p/8368048.html
https://scikit-learn.org/stable/modules/neighbors.html#classification
https://www.cnblogs.com/ybjourney/p/4702562.html

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