KNN能夠說是最簡單的分類算法之一,同時,它也是最經常使用的分類算法之一,注意KNN算法是有監督學習中的分類算法,它看起來和另外一個機器學習算法Kmeans有點像(Kmeans是無監督學習算法),但倒是有本質區別的。那麼什麼是KNN算法呢,接下來咱們就來介紹介紹吧。算法
KNN的全稱是K Nearest Neighbors,意思是K個最近的鄰居,從這個名字咱們就能看出一些KNN算法的蛛絲馬跡了。K個最近鄰居,毫無疑問,K的取值確定是相當重要的。那麼最近的鄰居又是怎麼回事呢?其實啊,KNN的原理就是當預測一個新的值x的時候,根據它距離最近的K個點是什麼類別來判斷x屬於哪一個類別。聽起來有點繞,仍是看看圖吧。
數據結構
圖中綠色的點就是咱們要預測的那個點,假設K=3。那麼KNN算法就會找到與它距離最近的三個點(這裏用圓圈把它圈起來了),看看哪一種類別多一些,好比這個例子中是藍色三角形多一些,新來的綠色點就歸類到藍三角了。機器學習
可是,當K=5的時候,斷定就變成不同了。此次變成紅圓多一些,因此新來的綠點被歸類成紅圓。從這個例子中,咱們就能看得出K的取值是很重要的。學習
明白了大概原理後,咱們就來講一說細節的東西吧,主要有兩個,K值的選取和點距離的計算。rest
要度量空間中點距離的話,有好幾種度量方式,好比常見的曼哈頓距離計算,歐式距離計算等等。不過一般KNN算法中使用的是歐式距離,這裏只是簡單說一下,拿二維平面爲例,,二維空間兩個點的歐式距離計算公式以下:blog
這個高中應該就有接觸到的了,其實就是計算(x1,y1)和(x2,y2)的距離。拓展到多維空間,則公式變成這樣:排序
這樣咱們就明白瞭如何計算距離,KNN算法最簡單粗暴的就是將預測點與全部點距離進行計算,而後保存並排序,選出前面K個值看看哪些類別比較多。但其實也能夠經過一些數據結構來輔助,好比最大堆,這裏就很少作介紹,有興趣能夠百度最大堆相關數據結構的知識。內存
經過上面那張圖咱們知道K的取值比較重要,那麼該如何肯定K取多少值好呢?答案是經過交叉驗證(將樣本數據按照必定比例,拆分出訓練用的數據和驗證用的數據,好比6:4拆分出部分訓練數據和驗證數據),從選取一個較小的K值開始,不斷增長K的值,而後計算驗證集合的方差,最終找到一個比較合適的K值。數學
經過交叉驗證計算方差後你大體會獲得下面這樣的圖:
基礎
這個圖其實很好理解,當你增大k的時候,通常錯誤率會先下降,由於有周圍更多的樣本能夠借鑑了,分類效果會變好。但注意,和K-means不同,當K值更大的時候,錯誤率會更高。這也很好理解,好比說你一共就35個樣本,當你K增大到30的時候,KNN基本上就沒意義了。
因此選擇K點的時候能夠選擇一個較大的臨界K點,當它繼續增大或減少的時候,錯誤率都會上升,好比圖中的K=10。具體如何得出K最佳值的代碼,下一節的代碼實例中會介紹。
KNN是一種非參的,惰性的算法模型。什麼是非參,什麼是惰性呢?
非參的意思並非說這個算法不須要參數,而是意味着這個模型不會對數據作出任何的假設,與之相對的是線性迴歸(咱們總會假設線性迴歸是一條直線)。也就是說KNN創建的模型結構是根據數據來決定的,這也比較符合現實的狀況,畢竟在現實中的狀況每每與理論上的假設是不相符的。
惰性又是什麼意思呢?想一想看,一樣是分類算法,邏輯迴歸須要先對數據進行大量訓練(tranning),最後纔會獲得一個算法模型。而KNN算法卻不須要,它沒有明確的訓練數據的過程,或者說這個過程很快。
瞭解KNN算法的優點和劣勢,能夠幫助咱們在選擇學習算法的時候作出更加明智的決定。那咱們就來看看KNN算法都有哪些優點以及其缺陷所在!
至於何時應該選擇使用KNN算法,sklearn的這張圖給了咱們一個答案。
簡單得說,當須要使用分類算法,且數據比較大的時候就能夠嘗試使用KNN算法進行分類了。
OK,本次先對KNN算法作一個介紹,下一節解析sklearn的參數,以及K值選取。