algo_KNN(k-nearest neighbor)

1 k-NN算法

k-近鄰(k-Nearest Neighbors, k-NN)算法是機器學習中非常簡單的一個算法,可以用於分類和迴歸問題。
其基本思想是,在特徵空間中接近的兩個實例,其類別/函數值也接近。對實例x,找到訓練樣本中和其接近的實例,也就是近鄰,然後根據近鄰的類別/函數值預測實例x的類別/函數值。

1.1 訓練

k-NN算法的訓練過程非常簡單,僅僅需要把訓練數據存儲起來。k-NN算法是一種懶惰學習(lazy learning):在訓練階段僅僅把訓練數據保存起來,訓練時間開銷爲0,所有的工作都留在測試階段。

1.2 預測

預測過程也非常清晰。對於輸入x,計算它和所有訓練實例之間的相似度,找到k個近鄰,然後根據k個近鄰的輸出得到x的輸出。對於分類問題,可以取k個近鄰中最常見的類別;對於迴歸問題,可以取k個近鄰輸出的均值。

1.2.1 距離度量

一般使用距離來度量相似度:距離越近越相似,越遠越不相似。

爲了確定輸入x的近鄰,需要計算x和所有訓練實例之間的距離。事實上,有多種不同的距離度量可供使用。

對於實值特徵向量x,yRd,常見的距離度量是Euclidean距離(歐氏距離),計算公式如下:

disteuclidean=i=1d(xiyi)2.

Manhattan距離(曼哈頓距離)也可以用於度量實值向量之間的距離,計算公式如下:

distmanhattan=i=1d|xiyi|.

歐氏距離和曼哈頓距離都是Minkowski距離(閔可夫斯基距離)的特例。

對於離散特徵向量x,y,可以使用Hamming距離(海明距離)度量向量之間的距離,計算公式如下:

disthamming=|{i|xiyi,i=1,2,,d}|.

除了這裏介紹的,還有很多其他距離度量:

  • Mahalanobis距離(馬氏距離)
  • cosine距離(餘弦距離)
  • Jaccard係數
  • Tanimoto係數

不同的距離度量對k-NN算法的結果會有不同的影響,需要根據輸入數據的特點選擇合適的距離度量。如果對輸入數據沒有任何先驗知識,可以把距離度量看做超參,把訓練數據劃分成訓練集和驗證集,在驗證集上嘗試不同的距離度量,選擇性能最好的那個。詳細過程見下面關於另一個超參k的選擇過程。

1.2.2 k值選擇

在得到輸入x和訓練實例之間的距離之後,需要選擇k個近鄰。k值取多少合適呢?

首先通過一個分類問題直觀感受一下k值對分類結果的影響。下面兩張圖給出了不同的k值對k-NN決策邊界的影響:
這裏寫圖片描述

白色區域表示不同類別投票數相同時的預測模糊區域。從圖中可以看出,k值越大,k-NN決策邊界越平滑。另外,在k值比較小時,會出現由異常點導致的分類錯誤的孤島,這表明此時出現了過擬合現象,即對訓練數據的噪聲也進行了很好地學習。

關於k值,再補充一個結論:k值越小,偏差越小,方差越大(和過擬合現象的吻合);k值越大,偏差越大,方差越小。

那麼怎麼確定k值呢?有不少文章研究k的自適應選擇問題,而最常見的方法還是驗證法。

把總訓練數據進行劃分成兩部分,一部分作爲訓練集,一部分作爲驗證集。對不同的k值,可以得到在驗證集上的性能(如果是分類問題,可以使用準確率;如果是迴歸問題,可以使用誤差平方和),取性能最好的那個k值作爲模型超參。

如果訓練數據比較少,可以採用交叉驗證法。把訓練數據等分成n份,每次取第i份作爲驗證集,得到k-NN在此驗證集上的性能。這樣,對某個確定的k值,可以得到n個性能值,取n個性能值的平均作爲相應模型的性能估計。對不同的k值都可以得到一個性能估計,取性能最好的那個k值作爲最優超參。

1.2.3 投票機制

確定了k個近鄰後,需要根據k個近鄰的輸出確定輸入x的輸出。

對於分類問題,可以採用投票法,即選擇k個近鄰中出現次數最多的類別作爲x的類別。也可以根據距離進行加權投票,距離越遠的近鄰權重越小,距離越近的近鄰權重越大。

對於迴歸問題,可以用k個近鄰輸出的均值作爲x的輸出結果。類似的,也可以根據距離進行加權平均。

1.3 數據預處理

爲了更充分地發揮k-NN算法的能力,有必要對數據進行預處理操作。

1.3.1 歸一化

由於不同維度特徵的量綱是不一樣的,比如體重(kg)和身高(cm),那麼在計算距離時,會導致不同維度的差異對距離的貢獻不同。所以有必要對輸入進行歸一化操作。

可以把輸入歸一化到[0, 1]範圍中;也可以把輸入歸一化到均值爲0,方差爲1,這種歸一化稱爲z變換。

1.3.2 降維

k-NN算法在低維空間中的效果更好,不適用於高維空間。

首先,在論文[1]中證明了,對於最近鄰算法(即k=1),當訓練樣本採樣密度足夠大時,其整體風險小於貝葉斯風險的兩倍。而輸入空間會隨着空間維數的增減而呈指數級增長,此時訓練樣本很難滿足密集採樣的條件。

其次,高維空間中的向量之間的距離是反直覺的,即我們認爲相似的物體在高維空間中距離可能非常遠,這和我們常見的二維三維空間不同。

在高維空間中出現的樣本稀疏問題以及距離反直覺問題被稱爲維數災難。

對高維數據,可以降維之後再應用k-NN算法。至於降維技術,可以選擇特徵提取,PCA等方法。

2 k-NN算法的計算複雜度

k-NN的訓練過程不需要花費時間,但測試階段要花費大量時間進行計算。可以通過犧牲準確率來降低測試階段的計算時間。常見的方法是構造kd樹。

參考

[1] Nearest Neighbor Pattern Classification. 1967.
[2] K-Nearest Neighbors for Machine Learning
[3] cs231n note
[4] K-Nearest Neighbors – the Laziest Machine Learning Technique

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