1. 程式人生 > >k最近鄰(KNN)分類法介紹

k最近鄰(KNN)分類法介紹

1.急切學習與懶惰學習

急切學習:在給定訓練元組之後、接收到測試元組之前就構造好泛化(即分類)模型。

屬於急切學習的演算法有:決策樹、貝葉斯、基於規則的分類、後向傳播分類、SVM和基於關聯規則挖掘的分類等等。

懶惰學習:直至給定一個測試元組才開始構造泛化模型,也稱為基於例項的學習法。

屬於急切學習的演算法有:KNN分類、基於案例的推理分類。

2.KNN的優缺點

優點:原理簡單,實現起來比較方便。支援增量學習。能對超多邊形的複雜決策空間建模。

缺點:計算開銷大,需要有效的儲存技術和並行硬體的支撐。

3.KNN演算法原理

基於類比學習,通過比較訓練元組和測試元組的相似度來學習。

將訓練元組和測試元組看作是n維(若元組有n的屬性)空間內的點,給定一條測試元組,搜尋n維空間,找出與測試

元組最相近的k個點(即訓練元組),最後取這k個點中的多數類作為測試元組的類別。

相近的度量方法:用空間內兩個點的距離來度量。距離越大,表示兩個點越不相似。

距離的選擇:可採用歐幾里得距離、曼哈頓距離或其它距離度量。多采用歐幾里得距離,簡單!

4.KNN演算法中的細節處理

  • 數值屬性規範化:將數值屬性規範到0-1區間以便於計算,也可防止大數值型屬性對分類的主導作用。

可選的方法有:v' = (v - vmin)/ (vmax - vmin),當然也可以採用其它的規範化方法

  • 比較的屬性是分類型別而不是數值型別的:同則差為0,異則差為1.

有時候可以作更為精確的處理,比如黑色與白色的差肯定要大於灰色與白色的差。

  • 缺失值的處理:取最大的可能差,對於分類屬性,如果屬性A的一個或兩個對應值丟失,則取差值為1;

如果A是數值屬性,若兩個比較的元組A屬性值均缺失,則取差值為1,若只有一個缺失,另一個值為v,

則取差值為|1-v|和|0-v|中的最大值

  • 確定K的值:通過實驗確定。進行若干次實驗,取分類誤差率最小的k值。
  • 對噪聲資料或不相關屬性的處理:對屬性賦予相關性權重w,w越大說明屬性對分類的影響越相關。對噪聲資料可以將所在

的元組直接cut掉。

5.KNN演算法流程

  • 準備資料,對資料進行預處理
  • 選用合適的資料結構儲存訓練資料和測試元組
  • 設定引數,如k
  • 維護一個大小為k的的按距離由大到小的優先順序佇列,用於儲存最近鄰訓練元組
  • 隨機從訓練元組中選取k個元組作為初始的最近鄰元組,分別計算測試元組到這k個元組的距離,將訓練元組標號和距離存入優先順序佇列
  • 遍歷訓練元組集,計算當前訓練元組與測試元組的距離,將所得距離L與優先順序佇列中的最大距離Lmax進行比較。若L>=Lmax,則捨棄該元組,遍歷下一個元組。若L < Lmax,刪除優先順序佇列中最大距離的元組,將當前訓練元組存入優先順序佇列。
  • 遍歷完畢,計算優先順序佇列中k個元組的多數類,並將其作為測試元組的類別。
  • 測試元組集測試完畢後計算誤差率,繼續設定不同的k值重新進行訓練,最後取誤差率最小的k值。

6.KNN演算法的改進策略

  • 將儲存的訓練元組預先排序並安排在搜尋樹中(如何排序有待研究)
  • 並行實現
  • 部分距離計算,取n個屬性的“子集”計算出部分距離,若超過設定的閾值則停止對當前元組作進一步計算。轉向下一個元組。
  • 剪枝或精簡:刪除證明是“無用的”元組。

7.KNN演算法java實現