經過計算待預測樣本和已知分類號的訓練樣本之間的距離來判斷該樣本屬於某個已知分類號的機率。並選取機率最大的分類號來做爲待預測樣本的分類號算法
懶惰分類算法,其模型的創建直到待預測實例進行預測時纔開始。ide
KNN算法的指導思想是「近朱者赤,近墨者黑」,由你的鄰居來推斷出你的類別。性能
本質上,KNN算法就是用距離來衡量樣本之間的類似度 學習
從訓練集中找到和新數據最接近的k條記錄,而後根據多數類來決定新數據類別。測試
算法涉及3個主要因素:idea
1) 訓練數據集spa
2) 距離或類似度的計算衡量對象
3) k的大小blog
1) 已知兩類「先驗」數據,分別是藍方塊和紅三角,他們分佈在一個二維空間中class
2) 有一個未知類別的數據(綠點),須要判斷它是屬於「藍方塊」仍是「紅三角」類
3) 考察離綠點最近的3個(或k個)數據點的類別,佔多數的類別即爲綠點斷定類別
計算步驟以下:
1)算距離:給定測試對象,計算它與訓練集中的每一個對象的距離
2)找鄰居:圈定距離最近的k個訓練對象,做爲測試對象的近鄰
3)作分類:根據這k個近鄰歸屬的主要類別,來對測試對象分類
距離越近應該意味着這兩個點屬於一個分類的可能性越大。但距離不能表明一切,有些數據的類似度衡量並不適合用距離
類似度衡量方法:空間上有歐氏距離,路徑上有曼哈頓距離,國際象棋上的一致範數:切比雪夫距離等,還有夾角餘弦等。
(簡單應用中,通常使用歐氏距離,但對於文本分類來講,使用餘弦(cosine)來計算類似度就比歐式(Euclidean)距離更合適)
簡單投票法:少數服從多數,近鄰中哪一個類別的點最多就分爲該類。
加權投票法:根據距離的遠近,對近鄰的投票進行加權,距離越近則權重越大(權重爲距離平方的倒數)
選定訓練集和對應的測試機,而後選取不一樣的k值,把其中錯誤率最低的k做爲分類的k值,當有新的訓練集更新時,咱們再運行模型,不斷迭代更新。通常來講k是不超過20的整數。k<sqrt(樣本數)
通常使用交叉驗證的方式
樣本不平衡容易致使結果錯誤
如一個類的樣本容量很大,而其餘類樣本容量很小時,有可能致使當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。
改善方法:對此能夠採用權值的方法(和該樣本距離小的鄰居權值大)來改進。
計算量較大
由於對每個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。
改善方法:事先對已知樣本點進行剪輯,事先去除對分類做用不大的樣本。
該方法比較適用於樣本容量比較大的類域的分類,而那些樣本容量較小的類域採用這種算法比較容易產生誤分。
kNN是一種懶惰算法,平時很差好學習,考試(對測試樣本分類)時才臨陣磨槍(臨時去找k個近鄰)。
懶惰的後果:構造模型很簡單,但在對測試樣本分類地的系統開銷大,由於要掃描所有訓練樣本並計算距離。
已經有一些方法提升計算的效率,例如壓縮訓練樣本量等,方法有濃縮技術、編輯技術等