我們通常將機器學習演算法分為有監督學習和無監督學習兩類,通俗的說,我們會按照訓練樣本中是否含有標籤來區分這兩類,knn演算法便是一種適用於帶標籤的資料場景的演算法,我們可以將它歸類為一種有監督學習方法。
knn演算法,我們給定乙個資料集,對於乙個新來到的樣本,我們在資料集中找到距離該樣本最近的k個樣本,在這k個樣本中某一類出現的次數最多我們就把這個新的樣本分到這個類別中。
舉乙個圖例:
如圖所示,紅色的三角和藍色的方塊為我們原有的資料集,綠色的圓即為乙個新來到的樣本,事先我們並不知道它屬於某一類,我們來嘗試兩種不同的k值下的分類方法:
當我們選取k=3時,很明顯距離綠色圓最近的三個樣本為兩個紅色三角和乙個藍色方塊,按照knn的分類原則我們就可以將綠色圓分為紅色三角一類。
當我們選取k=5時,很明顯距離綠色圓最近的五個樣本為兩個紅色三角和乙個藍色方塊,同理我們就可以將綠色園分為藍色方塊一類。
也就是這樣
k值的選取
藍色方塊個數
紅色三角個數
綠色圓分類
k=3■▲▲▲
k=5■■■▲▲■
由上例我們可以總結出knn演算法的基本步驟:
(1)計算資料集中每個點到測試資料的距離d(i);
(2)將算得的距離d(i)進行從小到大的排序;
(3)根據我們設定的k值選取排序後的前k個點;
(4)確定選取到的k個點中每一類別出現的頻率;
(5)將出現頻率最高的一類作為測試樣本的**分類結果。
從這個簡單的例子可以看出,當我們選取不同的k值時會有不同的結果,那我們應該如何去選擇k值,又應該如去計算資料集中每個樣本到新樣本之間的距離呢?下面我會給出解答。
距離的度量方法有很多種,我在這裡列出兩種常用的距離計算公式。
這是兩種常見的度量方法,在knn中我們通常會使用歐氏距離來計算距離,所以在這裡不對距離的度量做過多的介紹。
knn中的k值選取對分類的結果影響至關重要,k值選取的太小,模型太複雜。k值選取的太大,導致分類模糊。
舉例說明一下這個問題
和1中的例子同理,同樣是將綠色圓作為測試樣本,我們分別取k=1,k=7,k=n進行訓練。
k值的選取
藍色方塊個數
紅色三角個數
綠色圓的分類
k=1■
none
■k=7
■▲▲▲▲▲▲
▲k=n
■■■■■■■
▲▲▲▲▲▲
■很顯然當k=1的時候,我們使用了乙個複雜的模型,該模型下我們很容易的學習到了訓練樣本中的雜訊,從而導致了模型過擬合現象的出現;將k值增大,當k=7時,可以看出我們得到了乙個相對正確的分類;再繼續增大k值為n(訓練集所有樣本的個數),這種做法會導致我們將模型設計的過於簡單,從而導致**結果發生錯誤,由此可見選擇乙個合適的k值是多麼的重要。
如果選擇較小的k值,就相當於用較小的領域中的訓練例項進行**,「學習」近似誤差會減小,只有與輸入例項較近或相似的訓練例項才會對**結果起作用,與此同時帶來的問題是「學習」的估計誤差會增大,換句話說,k值的減小就意味著整體模型變得複雜,容易發生過擬合;
如果選擇較大的k值,就相當於用較大領域中的訓練例項進行**,其優點是可以減少學習的估計誤差,但缺點是學習的近似誤差會增大。這時候,與輸入例項較遠(不相似的)訓練例項也會對**器作用,使**發生錯誤,且k值的增大就意味著整體的模型變得簡單。
k=n,則完全不足取,因為此時無論輸入例項是什麼,都只是簡單的**它屬於在訓練例項中最多的累,模型過於簡單,忽略了訓練例項中大量有用資訊。
在實際應用中,k值一般取乙個比較小的數值,例如採用交叉驗證法(簡單來說,就是一部分樣本做訓練集,一部分做測試集)來選擇最優的k值。
我在這裡用sklearn中自帶的iris資料集以及knn演算法進行交叉驗證法選擇k值的實現。
from __future__ import print_function
from sklearn.datasets import load_iris
from sklearn.cross_validation import cross_val_score
import matplotlib.pyplot as plt
from sklearn.neighbors import kneighborsclassifier
iris = load_iris()
x = iris.data
y = iris.target
k_range = range(1, 31)
k_score =
for k in k_range:
knn = kneighborsclassifier(n_neighbors=k) #knn演算法中k的取值
score = cross_val_score(knn, x, y, cv=10, scoring='accuracy') #cv:選擇每次測試折數 accuracy:評價指標是準確度,可以省略使用預設值
plt.plot(k_range, k_score)
plt.xlabel("value of k for knn")
plt.ylabel("accuracy")
plt.show()
執行後的結果如下:
根據圖示結果我們就可以選擇出合適的k值進行knn模型的訓練。
優點:精度高、對異常值不敏感、可以用於非線性分類。
缺點:計算複雜度高、空間複雜度高。
適用資料範圍:數值型和標稱型。
機器學習 k 近鄰 kNN 演算法
一 基本原理 存在乙個樣本資料集合 也稱訓練樣本集 並且樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料 最近鄰 的分類標籤。我們一般只選擇樣本集中前k k通常是不大於20的整數 個最相似的資料,最後選擇k個...
機器學習 k近鄰演算法 kNN
knn演算法通過計算當前測試樣本與離它最近的k個點的距離,進行投票,得到它最有可能的分類結果。首先來看看機器學習演算法的基本流程 由此可見knn演算法的特點 1.k近鄰演算法是非常特殊的,可以認為是沒有模型的演算法。2.為了和其他演算法統一,可以認為訓練資料集就是模型本身。這也是scikit lea...
機器學習 k 近鄰演算法(KNN)
簡單地說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定。缺點 計算複雜度高 空間複雜度高。適用範圍 數值型和標稱型。對於該演算法更通俗的說法,拿到乙個資料a,計算其與資料集c中的資料的距離,通過使用特徵值進行求歐式距離。然後排序取出其前k相鄰的...