1. 程式人生 > >什麼是KNN演算法?

什麼是KNN演算法?

KNN(K-Nearest Neighbor)演算法是機器學習演算法中最基礎、最簡單的演算法之一。它既能用於分類,也能用於迴歸。KNN通過測量不同特徵值之間的距離來進行分類。

KNN演算法的思想非常簡單:對於任意n維輸入向量,分別對應於特徵空間中的一個點,輸出為該特徵向量所對應的類別標籤或預測值。

KNN演算法是一種非常特別的機器學習演算法,因為它沒有一般意義上的學習過程。它的工作原理是利用訓練資料對特徵向量空間進行劃分,並將劃分結果作為最終演算法模型。存在一個樣本資料集合,也稱作訓練樣本集,並且樣本集中的每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。

輸入沒有標籤的資料後,將這個沒有標籤的資料的每個特徵與樣本集中的資料對應的特徵進行比較,然後提取樣本中特徵最相近的資料(最近鄰)的分類標籤。

一般而言,我們只選擇樣本資料集中前k個最相似的資料,這就是KNN演算法中K的由來,通常k是不大於20的整數。最後,選擇k個最相似資料中出現次數最多的類別,作為新資料的分類。

KNN分類演算法

KNN分類演算法的分類預測過程十分簡單並容易理解:對於一個需要預測的輸入向量x,我們只需要在訓練資料集中尋找k個與向量x最近的向量的集合,然後把x的類別預測為這k個樣本中類別數最多的那一類。

如圖所示,ω1、ω2、ω3分別代表訓練集中的三個類別。其中,與xu最相近的5個點(k=5)如圖中箭頭所指,很明顯與其最相近的5個點中最多的類別為ω1,因此,KNN演算法將xu的類別預測為ω1。

基於上述思想給出如下所示的KNN演算法:

輸入:訓練資料集

其中: 

為n維的例項特徵向量。 

為例項的類別,其中,i=1,2,…,N,預測例項x。

輸出:預測例項x所屬類別y。

演算法執行步驟:

1. 根據給定的距離量度方法(一般情況下使用歐氏距離)在訓練集T中找出與x最相近的k個樣本點,並將這k個樣本點所表示的集合記為N_k(x);

2. 根據如下所示的多數投票的原則確定例項x所屬類別y:

上式中I為指示函式:

通過上述KNN演算法原理的講解,我們發現要使KNN演算法能夠執行必須首先確定兩個因素:(1)演算法超引數k;(2)模型向量空間的距離量度。

K值的確定

KNN演算法中只有一個超引數k,k值的確定對KNN演算法的預測結果有著至關重要的影響。接下來,我們討論一下k值大小對演算法結果的影響以及一般情況下如何選擇k值。

如果k值比較小,相當於我們在較小的領域內訓練樣本對例項進行預測。這時,演算法的近似誤差(Approximate Error)會比較小,因為只有與輸入例項相近的訓練樣本才會對預測結果起作用。

但是,它也有明顯的缺點:演算法的估計誤差比較大,預測結果會對近鄰點十分敏感,也就是說,如果近鄰點是噪聲點的話,預測就會出錯。因此,k值過小容易導致KNN演算法的過擬合。

同理,如果k值選擇較大的話,距離較遠的訓練樣本也能夠對例項預測結果產生影響。這時候,模型相對比較魯棒,不會因為個別噪聲點對最終預測結果產生影響。但是缺點也十分明顯:演算法的近鄰誤差會偏大,距離較遠的點(與預測例項不相似)也會同樣對預測結果產生影響,使得預測結果產生較大偏差,此時模型容易發生欠擬合。

因此,在實際工程實踐中,我們一般採用交叉驗證的方式選取k值。通過以上分析可知,一般k值選得比較小,我們會在較小範圍內選取k值,同時把測試集上準確率最高的那個確定為最終的演算法超引數k。

距離量度

樣本空間內的兩個點之間的距離量度表示兩個樣本點之間的相似程度:距離越短,表示相似程度越高;反之,相似程度越低。

常用的距離量度方式包括:

閔可夫斯基距離

歐氏距離

曼哈頓距離

切比雪夫距離

餘弦距離

閔可夫斯基距離

閔可夫斯基距離本身不是一種距離,而是一類距離的定義。對於n維空間中的兩個點x(x1,x2,…,xn)和y(y1,y2,…,yn),x和y之間的閔可夫斯基距離可以表示為:

其中,p是一個可變引數:

當p=1時,被稱為曼哈頓距離;

當p=2時,被稱為歐氏距離;

當p=\infty時,被稱為切比雪夫距離。

歐氏距離

根據以上定義,歐氏距離可以寫為:

 歐氏距離(L2範數)是最易於理解的一種距離計算方法,源自歐氏空間中兩點間的距離公式,也是最常用的距離量度。

曼哈頓距離

根據閔可夫斯基距離定義,曼哈頓距離的計算公式可以寫為:

KNN演算法的核心:KDTree

KNN分類演算法的思想非常簡單,就是k個最近鄰多數投票的思想,關鍵就是在給定的距離量度下,如果快速找到預測例項的最近的k個鄰居?

初學者一般採用直接暴力尋找的方法,因為k值一般不會取得特別大。確實,特徵空間維度不高且訓練樣本容量小時,暴力尋找方法是可行的,但是當特徵空間維度特別高或者樣本容量較大時,計算過程就會非常耗時,這種方法就不可行了。

因此,為了快速查詢到k個近鄰,我們可以考慮使用特殊的資料結構儲存訓練資料,用來減少搜尋次數。其中,KDTree就是最著名的一種。

KDTree(K-dimension Tree)是一種對k維空間中的例項點進行儲存以便對其進行快速檢索的樹形資料結構。KDTree是一種二叉樹,表示對k維空間的一種劃分構造KDTree相當於不斷地利用垂直於座標軸的超平面將k維空間進行切分,構成一系列的k維超矩形區域。KDTree的每個節點對應於一個k維超矩形區域。利用KDTree可以省去對大部分資料點的搜尋,從而減少搜尋的計算量。

KDTree的構造

我們使用遞迴方法來構造KDTree:(1)構造根節點,使根節點對應於k維空間中包含的所有點的超矩形區域;(2)不斷地對k維空間進行切分,生成子節點。

構造根節點

首先,在包含所有節點的超矩形區域內選擇一個座標軸和在此座標軸上的一個切分點,確定一個垂直於該座標軸的超平面,這個超平面將當前區域劃分為兩個子區域(即二叉樹的左右兩個子節點)。

遞迴構造子節點

通過遞迴方法對兩個子區域進行相同的劃分,知道子區域內沒有例項時終止(此時只有子節點)。

通常我們迴圈地選擇座標軸對空間進行劃分,當選定一個維度座標時,我們選擇所有訓練例項在該座標軸上的中位數作為切分點。此時,我們構造的KDTree是平衡二叉樹,但是平衡二叉樹在搜尋近鄰時並不一定是最高效的。

KNN迴歸演算法

上文所述的KNN演算法主要用於分類,實際上,KNN演算法也可以用於迴歸預測。接下來,我們討論一下KNN演算法如何用於迴歸。

與分類預測類似,KNN演算法用於迴歸預測時,同樣是尋找新來的預測例項的k近鄰,然後對這k個樣本的目標值去均值即可作為新樣本的預測值:

KNN的侷限性

KNN有著非常明顯的優點和缺點:

優點:精度高、對異常值不敏感、無資料輸入假定

缺點:計算複雜度高、空間複雜度高

適用資料範圍:數值型和標稱型

在理想化的經典場景中,KNN是非常好用的,但是在非理想化、非經典場景中,KNN這種方法就有點力不從心了。K值究竟選多少?我們需要跟哪些關鍵屬性計算距離?如果我們需要計算的屬性很多,對計算機的資源消耗也很大,非常不划算。

相關文章