knn可以說是最簡單的分類演算法之一,同時,它也是最常用的分類演算法之一,注意knn演算法是有監督學習中的分類演算法,它看起來和另乙個機器學習演算法kmeans有點像(kmeans是無監督學習演算法)。關於k-means可以看上篇部落格。
knn的全稱是k nearest neighbors,意思是k個最近的鄰居,k的取值肯定是至關重要的。其實啊,knn的原理就是當**乙個新的值x的時候,根據它距離最近的k個點是什麼類別來判斷x屬於哪個類別。
如下圖,k=3時候,綠色x判定為藍色。
主要有兩個,k值的選取和點距離的計算。
2.1 距離計算
曼哈頓距離和歐氏距離。這裡不再重複說明了。
2.2 k值的選擇
通過上面那張圖我們知道k的取值比較重要,那麼該如何確定k取多少值好呢?答案是通過交叉驗證(將樣本資料按照一定比例,拆分出訓練用的資料和驗證用的資料,比如6:4拆分出部分訓練資料和驗證資料),從選取乙個較小的k值開始,不斷增加k的值,然後計算驗證集合的方差,最終找到乙個比較合適的k值。
通過交叉驗證計算方差後你大致會得到下面這樣的圖:
這個圖其實很好理解,當你增大k的時候,一般錯誤率會先降低,因為有周圍更多的樣本可以借鑑了,分類效果會變好。但注意,和k-means不一樣,當k值更大的時候,錯誤率會更高。這也很好理解,比如說你一共就35個樣本,當你k增大到30的時候,knn基本上就沒意義了。所以選擇k點的時候可以選擇乙個較大的臨界k點,當它繼續增大或減小的時候,錯誤率都會上公升,比如圖中的k=10。
knn是一種非參的,惰性的演算法模型。
非參的意思並不是說這個演算法不需要引數,而是意味著這個模型不會對資料做出任何的假設,與之相對的是線性回歸(我們總會假設線性回歸是一條直線)。也就是說knn建立的模型結構是根據資料來決定的,這也比較符合現實的情況,畢竟在現實中的情況往往與理論上的假設是不相符的。惰性又是什麼意思呢?想想看,同樣是分類演算法,邏輯回歸需要先對資料進行大量訓練(tranning),最後才會得到乙個演算法模型。而knn演算法卻不需要,它沒有明確的訓練資料的過程,或者說這個過程很快。
knn演算法優點
1、簡單易用,相比其他演算法,knn算是比較簡潔明瞭的演算法。即使沒有很高的數學基礎也能搞清楚它的原理。
2、模型訓練時間快,上面說到knn演算法是惰性的,這裡也就不再過多講述。
3、**效果好。
4、對異常值不敏感
knn演算法缺點
1、對記憶體要求較高,因為該演算法儲存了所有訓練資料
2、**階段可能很慢
3、對不相關的功能和資料規模敏感
簡單得說,當需要使用分類演算法,且資料比較大的時候就可以嘗試使用knn演算法進行分類了。
1、knn和 k-means 聚類由什麼不同?
k-means 是聚類演算法,knn 是分類演算法。
knn需要標記點,因此是有監督的學習,而k-means不是,因此是無監督學習。
k均值聚類僅需要一組未標記的點和閾值:演算法將採用未標記的點並逐漸學習如何通過計算不同點之間的距離的平均值將它們聚類成組。
最後,k 值的含義不同。k-means 中的 k 值代表 k 類。knn 中的 k 值代表 k 個最接近的鄰居。
常見面試題
1.get和post的區別 1 本質區別 get是向伺服器請求資料,post是向伺服器傳送資料。2 伺服器獲取值的方式 get方式提交的資料,伺服器端使用request.querystring獲取變數的值。post方式提交的資料,伺服器端使用request.form獲取資料。3 安全性 get安全效...
常見面試題
1 一行 實現1 100之和 lst i for i in range 1,101 print sum lst 2 如何在乙個函式內部修改全域性變數?在函式內部新增 global 變數名 這樣就可以在本地作用域定義全域性作用域了 name 大明 def eat name1 global name n...
常見面試題
dns解析 發起tcp三次握手,並建立tcp連線 發起http請求 伺服器相應http請求並得到html 伺服器解析html 並對頁面進行渲染然後返回給使用者 首先先進行ioc容器的初始化 ioc 容器的初始化過程分為三步驟 resource 定位 beandefinition 的載入和解析,bea...