深入淺出KNN算法(一) KNN算法原理


一.KNN算法概述

KNN可以說是最簡單的分類算法之一,同時,它也是最常用的分類算法之一,注意KNN算法是有監督學習中的分類算法,它看起來和另一個機器學習算法Kmeans有點像(Kmeans是無監督學習算法),但卻是有本質區別的。那么什么是KNN算法呢,接下來我們就來介紹介紹吧。

二.KNN算法介紹

KNN的全稱是K Nearest Neighbors,意思是K個最近的鄰居,從這個名字我們就能看出一些KNN算法的蛛絲馬跡了。K個最近鄰居,毫無疑問,K的取值肯定是至關重要的。那么最近的鄰居又是怎么回事呢?其實啊,KNN的原理就是當預測一個新的值x的時候,根據它距離最近的K個點是什么類別來判斷x屬於哪個類別。聽起來有點繞,還是看看圖吧。
KNN原理1

圖中綠色的點就是我們要預測的那個點,假設K=3。那么KNN算法就會找到與它距離最近的三個點(這里用圓圈把它圈起來了),看看哪種類別多一些,比如這個例子中是藍色三角形多一些,新來的綠色點就歸類到藍三角了。

KNN原理2

但是,當K=5的時候,判定就變成不一樣了。這次變成紅圓多一些,所以新來的綠點被歸類成紅圓。從這個例子中,我們就能看得出K的取值是很重要的。

明白了大概原理后,我們就來說一說細節的東西吧,主要有兩個,K值的選取點距離的計算

2.1距離計算

要度量空間中點距離的話,有好幾種度量方式,比如常見的曼哈頓距離計算,歐式距離計算等等。不過通常KNN算法中使用的是歐式距離,這里只是簡單說一下,拿二維平面為例,,二維空間兩個點的歐式距離計算公式如下:

二維空間歐式距離

這個高中應該就有接觸到的了,其實就是計算(x1,y1)和(x2,y2)的距離。拓展到多維空間,則公式變成這樣:

多維空間歐式距離

這樣我們就明白了如何計算距離,KNN算法最簡單粗暴的就是將預測點與所有點距離進行計算,然后保存並排序,選出前面K個值看看哪些類別比較多。但其實也可以通過一些數據結構來輔助,比如最大堆,這里就不多做介紹,有興趣可以百度最大堆相關數據結構的知識。

2.2 K值選擇

通過上面那張圖我們知道K的取值比較重要,那么該如何確定K取多少值好呢?答案是通過交叉驗證(將樣本數據按照一定比例,拆分出訓練用的數據和驗證用的數據,比如6:4拆分出部分訓練數據和驗證數據),從選取一個較小的K值開始,不斷增加K的值,然后計算驗證集合的方差,最終找到一個比較合適的K值。

通過交叉驗證計算方差后你大致會得到下面這樣的圖:
K值與Error

這個圖其實很好理解,當你增大k的時候,一般錯誤率會先降低,因為有周圍更多的樣本可以借鑒了,分類效果會變好。但注意,和K-means不一樣,當K值更大的時候,錯誤率會更高。這也很好理解,比如說你一共就35個樣本,當你K增大到30的時候,KNN基本上就沒意義了。

所以選擇K點的時候可以選擇一個較大的臨界K點,當它繼續增大或減小的時候,錯誤率都會上升,比如圖中的K=10。具體如何得出K最佳值的代碼,下一節的代碼實例中會介紹。

三.KNN特點

KNN是一種非參的惰性的算法模型。什么是非參,什么是惰性呢?

非參的意思並不是說這個算法不需要參數,而是意味着這個模型不會對數據做出任何的假設,與之相對的是線性回歸(我們總會假設線性回歸是一條直線)。也就是說KNN建立的模型結構是根據數據來決定的,這也比較符合現實的情況,畢竟在現實中的情況往往與理論上的假設是不相符的。

惰性又是什么意思呢?想想看,同樣是分類算法,邏輯回歸需要先對數據進行大量訓練(tranning),最后才會得到一個算法模型。而KNN算法卻不需要,它沒有明確的訓練數據的過程,或者說這個過程很快。

KNN算法的優勢和劣勢

了解KNN算法的優勢和劣勢,可以幫助我們在選擇學習算法的時候做出更加明智的決定。那我們就來看看KNN算法都有哪些優勢以及其缺陷所在!

KNN算法優點

  1. 簡單易用,相比其他算法,KNN算是比較簡潔明了的算法。即使沒有很高的數學基礎也能搞清楚它的原理。
  2. 模型訓練時間快,上面說到KNN算法是惰性的,這里也就不再過多講述。
  3. 預測效果好。
  4. 對異常值不敏感

KNN算法缺點

  1. 對內存要求較高,因為該算法存儲了所有訓練數據
  2. 預測階段可能很慢
  3. 對不相關的功能和數據規模敏感

至於什么時候應該選擇使用KNN算法,sklearn的這張圖給了我們一個答案。
sklearn算法選擇
簡單得說,當需要使用分類算法,且數據比較大的時候就可以嘗試使用KNN算法進行分類了。

OK,本次先對KNN算法做一個介紹,下一節解析sklearn的參數,以及K值選取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM