KNN算法思路
kNN是通過測量不同樣本之間的距離進行分類,認爲樣本可以最接近它的k個鄰居來代表。
思路
如果一個樣本在特徵空間中的k個鄰居樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,通常 。kNN算法中,所選擇的鄰居都是已經正確分類的對象。
算法過程
- 計算當前測試樣本與每個訓練樣本之間的距離
- 按照距離的遞增關係進行排序
- 選取距離最小的k個點
- 確定前k個點的類別頻率
- 返回前k個點中出現頻率最高的類別作爲
優點
- 簡單,易實現,無需估計參數,無需訓練
- 適合稀有事件分類問題(例如當流失率很低時,比如低於0.5%,構造流失預測模型)
- 適合多分類問題,例如根據基因特徵來判斷其功能分類,kNN比SVM的表現要好
缺點
- 懶惰算法,對測試樣本分類時的計算量大,內存開銷大,評分慢
- 可解釋性較差,無法給出決策樹那樣的規則
常見問題
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