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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。