機器學習十大經典算法之KNN最近鄰算法


KNN簡介

KNN(K-NearestNeighbor)是機器學習入門級的分類算法,很是簡單。它實現將距離近的樣本點劃爲同一類別;KNN中的K指的是近鄰個數,也就是最近的K個點 ;根據它距離最近的K個點是什麼類別來判斷屬於哪一個類別。html

KNN算法步驟

咱們有一堆樣本點,類別已知,以下圖左,藍色爲一類,黃色爲另外一類。如今有個新樣本點,也就是圖中黑色的叉叉,須要判斷它屬於哪一類。node

KNN作的就是選出距離目標點黑叉叉距離最近的k個點,看這k個點的大多數顏色是什麼顏色。這裏的距離用歐氏距離來度量。git

給定兩個樣本 ,其中n表示特徵數 ,X和Y兩個向量間的歐氏距離(Euclidean Distance)表示爲:github

當咱們設定k=1時,距離目標點最近的點是黃色,就認爲目標點屬於黃色那類。當k設爲3時,咱們能夠看到距離最近的三個點,有兩個是藍色,一個是黃色,所以認爲目標點屬於藍色的一類。web

因此,K的選擇不一樣,獲得的結果也會不一樣。算法

K值選擇

KNN的決策邊界通常不是線性的,也就是說KNN是一種非線性分類器,以下圖。微信

K越小越容易過擬合,當K=1時,這時只根據單個近鄰進行預測,若是離目標點最近的一個點是噪聲,就會出錯,此時模型複雜度高,穩健性低,決策邊界崎嶇機器學習

可是若是K取的過大,這時與目標點較遠的樣本點也會對預測起做用,就會致使欠擬合,此時模型變得簡單,決策邊界變平滑編輯器

尋找最合適的K值,比較經典的方法是N折交叉驗證
ide

上圖展現的是5折交叉驗證,也就是將已知樣本集等分爲5份,其中4份做爲訓練集,1份爲驗證集,作出5個模型

具體過程

將樣本數據按照必定比例,拆分出訓練用的數據和驗證用的數據,好比6:4拆分出部分訓練數據和驗證數據,從選取一個較小的K值開始,不斷增長K的值,而後計算驗證集合的方差,最終找到一個比較合適的K值。

經過交叉驗證計算方差後你大體會獲得下面這樣的圖:

由上圖可知,當你增大k的時候,通常錯誤率會先下降,由於有周圍更多的樣本能夠借鑑了,分類效果會變好。但注意,和K-means不同,當K值更大的時候,錯誤率會更高。這也很好理解,好比說你一共就35個樣本,當你K增大到30的時候,KNN基本上就沒意義了。

因此選擇K點的時候能夠選擇一個較大的臨界K點,當它繼續增大或減少的時候,錯誤率都會上升,好比圖中的K=10。

PS:處理數據要先對其進行標準化

也能夠採用標準差標準化

KNN優缺點

KNN的優勢在於原理簡單,容易實現,對於邊界不規則數據的分類效果好於線性分類器。

缺點:

  • 要保存所有數據集,須要大量的存儲空間;
  • 須要計算每一個未知點到所有已知點的距離,很是耗時;
  • 對於不平衡數據效果很差,須要進行改進;
  • 不適用於特徵空間維度高的狀況。

代碼實現

僞代碼

對測試樣本點進行如下操做:

(1)計算已知類別數據集中的點與當前點之間的距離;

(2)按照距離遞增次序排序;

(3)選取與當前點距離最小的k個點;

(4)肯定前k個點所在類別的出現頻率;

(5)返回前k個點出現頻率最高的類別做爲當前點的預測分類。

具體實現

https://github.com/GreedyAIAcademy/Machine-Learning/tree/master/2.KNN

參考文章

https://www.cnblogs.com/listenfwind/p/10311496.html


本文分享自微信公衆號 - 計算機視覺CV(jsjsjcv)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索