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