1. 程式人生 > >KNN演算法原理及例項

KNN演算法原理及例項

文章目錄

KNN演算法原理

K最近鄰(K-Nearest Neighbor,KNN)演算法,是著名的模式識別統計學方法,在機器學習分類演算法中佔有相當大的地位。

KNN演算法的核心思想是如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。K通常是不大於20的整數。KNN演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。

KNN演算法三要素

對於KNN演算法,我們主要要考慮三個重要的要素,即:k值的選取,距離度量的方式和分類決策規則。對於固定的訓練集,只要這三點確定了,演算法的預測方式也就決定了。

K值的選擇

對於k值的選擇,沒有一個固定的經驗,一般根據樣本的分佈,選擇一個較小的值,可以通過交叉驗證選擇一個合適的k值。K通常是不大於20的整數。

選擇較小的k值,就相當於用較小的領域中的訓練例項進行預測,訓練誤差會減小,只有與輸入例項較近或相似的訓練例項才會對預測結果起作用,與此同時帶來的問題是泛化誤差會增大。換句話說,K值的減小就意味著整體模型變得複雜,容易發生過擬合。

選擇較大的k值,就相當於用較大領域中的訓練例項進行預測,其優點是可以減少泛化誤差,但缺點是訓練誤差會增大。這時候,與輸入例項較遠(不相似的)訓練例項也會對預測器作用,使預測發生錯誤,且K值的增大就意味著整體的模型變得簡單。

一個極端的情況是k等於樣本數m,此時完全沒有分類,此時無論輸入例項是什麼,都只是簡單的預測它屬於在訓練例項中最多的類,模型過於簡單。

K值的選擇方法:

一種常見的方法是從k等於訓練集中樣本數量的平方根開始。比如訓練集中有100個案例,則k可以從10開始進行進行進一步篩選。

另一種方法是基於各種測試資料測試多個k值,並選擇一個可以提供最好分類效能的k值。除非資料的噪聲非常大,否則大的訓練集可以使k值的選擇不那麼重要。

還有一種方法是選擇一個較大的k值,同時用一個權重投票(weighted voting),在這個過程中,認為較近鄰的投票比遠的投票權重更大。

距離度量的方式

在KNN中,通過計算物件間距離來作為各個物件之間的非相似性指標,避免了物件之間的匹配問題。KNN通過依據k個物件中佔優的類別進行決策,而不是單一的物件類別決策。

最常用的方式是歐式距離,其公式為:

d ( x , y ) = k = 1 n ( x k y k ) 2 d ( x , y ) = \sqrt { \sum _ { k = 1 } ^ { n } \left( x _ { k } - y _ { k } \right) ^ { 2 } }

我們還可以使用曼哈頓距離,其公式為:

d ( x , y ) = k = 1 n x k y k d ( x , y ) = \sqrt { \sum _ { k = 1 } ^ { n } \left| x _ { k } - y _ { k } \right| }

我們還可以用閔可夫斯基距離,其公式為:

D ( x , y ) = ( x 1 y 1 ) p + ( x 2 y 2 ) p + + ( x n y n ) p p = i = 1 n ( x i y i ) p p D ( x , y ) = \sqrt [ p ] { \left( \left| x _ { 1 } - y _ { 1 } \right| \right) ^ { p } + \left( \left| x _ { 2 } - y _ { 2 } \right| \right) ^ { p } + \ldots + \left( \left| x _ { n } - y _ { n } \right| \right) ^ { p } } = \sqrt [ p ] { \sum _ { i = 1 } ^ { n } \left( \left| x _ { i } - y _ { i } \right| \right) ^ { p } }

我們可以發現,歐式距離是閔可夫斯基距離距離在p=2時的特例,而曼哈頓距離是p=1時的特例。

分類決策規則

對於分類決策規則,一般都是使用前面提到的多數表決法。即如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。

KNN演算法的計算過程

輸入訓練集資料和標籤,輸入測試資料;

計算測試資料與各個訓練資料之間的距離;

按照距離的遞增關係進行排序,選取距離最小的K個點;

確定前K個點所在類別的出現頻率,返回前K個點中出現頻率最高的類別作為測試資料的預測分類。

KNN演算法例項

下圖中有兩類的樣本資料,一類是藍色正方形,另一類是紅色三角形,中間綠色的圓形是待分類資料:

在這裡插入圖片描述

如果我們選擇K=3,那麼離綠色點最近有2個紅色的三角形和1個藍色的正方形,這三個點屬於最裡面的圓圈,對這三個點的類別進行統計,顯然紅色三角形的出現頻率高,所以綠色圓圈的待分類點屬於紅色三角形;

如果我們選擇K=5,那麼離綠色點最近有2個紅色三角形和3個藍色正方形,這五個點屬於外面一層圓圈,對這五個點的類別進行統計,顯然藍色正方形的出現頻率高,所以綠色圓圈的待分類點就屬於藍色正方形。

KNN演算法的優點和缺點

KNN演算法的優點:

  • KNN可以用來做分類也可以用來做迴歸;

  • 可用於非線性分類;

  • 訓練時間複雜度比支援向量機之類的演算法低,僅為O(n);

  • KNN與樸素貝葉斯之類的演算法比,對資料沒有假設,準確度高,對異常點不敏感;

  • KNN方法主要靠周圍有限個鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合;

  • KNN演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分;

  • 特別適合於多分類問題(multi-modal,物件具有多個類別標籤),KNN要比SVM表現要好。

KNN演算法的缺點:

  • 特徵數比較多時,計算量很大;

  • 樣本各類別數量不平衡時,對稀有類別的預測準確率低;

  • KD樹,球樹的模型建立需要大量的記憶體空間;

  • 使用懶散學習方法,因此預測時速度比邏輯迴歸演算法要慢;

  • 相比決策樹模型,KNN模型可解釋性不強。