深入淺出KNN演算法 一 KNN演算法原理

2021-10-10 16:41:54 字數 2348 閱讀 6163

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

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

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

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

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

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

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

通過上面那張圖我們知道k的取值比較重要,那麼該如何確定k取多少值好呢?答案是通過交叉驗證(將樣本資料按照一定比例,拆分出訓練用的資料和驗證用的資料,比如6:4拆分出部分訓練資料和驗證資料),從選取乙個較小的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演算法都有哪些優勢以及其缺陷所在!

1.簡單易用,相比其他演算法,knn算是比較簡潔明瞭的演算法。即使沒有很高的數學基礎也能搞清楚它的原理。

2.模型訓練時間塊,上面說到knn演算法是惰性的,這裡也就不再過多講述。

3.**效果好。

4.對異常值不敏感

knn演算法缺點

對記憶體要求較高,因為該演算法儲存了所有訓練資料

**階段可能很慢

對不相關的功能和資料規模敏感

至於什麼時候應該選擇使用knn演算法,sklearn的這張圖給了我們乙個答案。

簡單得說,當需要使用分類演算法,且資料比較大的時候就可以嘗試使用knn演算法進行分類了。

ok,本次先對knn演算法做乙個介紹,下一節解析sklearn的引數,以及k值選取。

深入淺出KNN演算法(一) 介紹篇

knn可以說是最簡單的分類演算法之一,同時,它也是最常用的分類演算法之一,注意knn演算法是有監督學習中的分類演算法,它看起來和另乙個機器學習演算法kmeans有點像 kmeans是無監督學習演算法 但卻是有本質區別的。那麼什麼是knn演算法呢,接下來我們就來介紹介紹吧。knn的全稱是k neare...

KMP演算法深入淺出

s ababcababa p ababa kmp演算法與bf演算法的區別就在於kmp演算法巧妙的消除了指標i的回溯問題,只需確定下次匹配j的位置即可,使得問題的複雜度由o mn 下降到o m n 在kmp演算法中,為了確定在匹配不成功時,下次匹配時j的位置,引入了next陣列,next j 的值表示...

深入淺出K Means演算法

摘要 在資料探勘中,k means演算法是一種 cluster analysis 的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種子點最近均值的演算法。在資料探勘中,k means演算法是一種cluster analysis的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種...