1. 程式人生 > >KNN演算法(有監督學習演算法)

KNN演算法(有監督學習演算法)

一、KNN演算法簡介
  KNN演算法又稱k近鄰分類(k-nearest neighbor classification)演算法。它是根據不同特徵值之間的距離來進行分類的一種簡單的機器學習方法,它是一種簡單但是懶惰的演算法。他的訓練資料都是有標籤的資料,即訓練的資料都有自己的類別。KNN演算法主要應用領域是對未知事物進行分類,即判斷未知事物屬於哪一類,判斷思想是,基於歐幾里得定理,判斷未知事物的特徵和哪一類已知事物的的特徵最接近。它也可以用於迴歸,通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。
  以下面一個KNN演算法的例子來說明KNN演算法的特點。

這裡寫圖片描述

  上圖中,要判斷綠色的圓屬於哪個類,是紅色三角形還是藍色四方形?如果K=3,由於紅色三角形所佔比例為2/3,綠色圓將被賦予紅色三角形那個類,如果K=5,由於藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。
   在利用KNN演算法判斷類別時K的取值很重要。KNN演算法主要依據鄰近的k個樣本來進行類別的判斷。然後依據k個樣本中出現次數最多的類別作為未知樣本的類別。這也就是我們常常說到的“物以類聚,人以群分”、“近朱者赤,近墨者黑”。

二、KNN演算法的思想和步驟
2.1、KNN演算法的思想
  KNN演算法用於分類的核心思想是:存在一個樣本資料集合,也稱訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每個資料與其所屬分類的關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料(最近鄰)的分類標籤。一般來說,我們只選擇樣本資料集中前k個最相似的資料,這就是k近鄰演算法中k的出處(通常k<20)。最後,我們選擇k個最相似資料中出現次數最多的分類,作為新資料的分類。
  KNN演算法用於迴歸的核心思想是:跟上面一樣,找到近鄰的k個樣本,然後取平均值作為未知樣本的值,對其進行預測。
2.2、KNN演算法的步驟
演算法步驟如下:
  1)算距離:給定未知物件,計算它與訓練集中的每個物件的距離;
   2)找近鄰:圈定距離最近的k個訓練物件,作為未知物件的近鄰;
  3)做分類:在這k個近鄰中出線次數最多的類別就是測試物件的預測類別。

三、KNN演算法的核心知識
3.1、距離或相似度的衡量
  在KNN演算法中常使用歐氏距離、曼哈頓距離和夾角餘弦來計算距離從而來衡量各個物件之間的非相似度。在實際中使用哪一種衡量方法需要具體情況具體分析。對於關係型資料,常使用歐氏距離;對於文字分類來說,使用夾角餘弦(cosine)來計算相似度就比歐式(Euclidean)距離更合適。
3.2、k值的選取
  在KNN演算法中k的選取非常重要,KNN分類的準備率對K值很敏感。不同的值有可能帶來不同的結果。如果K選大了的話,可能求出來的k最近鄰集合可能包含了太多隸屬於其它類別的樣本點,不具有代表性,最極端的就是k取訓練集的大小,此時無論輸入例項是什麼,都只是簡單的預測它屬於在訓練例項中最多的類,模型過於簡單,忽略了訓練例項中大量有用資訊。如果K選小了的話,結果對噪音樣本點很敏感。在實際中,一般採用交叉驗證(一部分樣本做訓練集,一部分做測試集)或者依靠經驗的方法來選取k值。k值初始時取一個比較小的數值,之後不斷來調整K值的大小來使得樣本分類最優,最優時的K值即為所選值。k值一般為奇數。有一個經驗規則:k一般低於訓練樣本數的平方根。
3.3、類別的判定
  投票決定:少數服從多數,在k個近鄰中哪個類別的點最多就分為哪類。
  加權投票法:根據距離的遠近,對近鄰的投票進行加權,距離越近則權重越大(權重為距離平方的倒數)。這是考慮到各個物件的相似度有懸殊,不同距離的樣本有可能對未知樣本產生的影響不同。
3.4、k個鄰近樣本的選取
  在KKN演算法中,整個樣本集中的每一個樣本都要與待測樣本的進行距離的計算,然後在其中取k個最近鄰。但這帶來了巨大的距離計算量,這也就是懶惰演算法所帶來的計算成本。改進方案有兩個:一個是對樣本集進行組織與整理,分群分層,儘可能將計算壓縮到在接近測試樣本鄰域的小範圍內,避免盲目地與訓練樣本集中每個樣本進行距離計算。另一個就是在原有樣本集中挑選出對分類計算有效的樣本,使樣本總數合理地減少,以同時達到既減少計算量,又減少儲存量的雙重效果。KD樹方法採用的就是第一個思路,壓縮近鄰演算法採用的是第二個思路。

四、KNN演算法的優缺點
4.1、優點
  (1) 簡單,易於理解,易於實現,無需估計引數,無需訓練;
  (2) 適合對稀有事件進行分類(例如當流失率很低時,比如低於0.5%,構造流失預測模型);
  (3) 特別適合於多分類問題(multi-modal,物件具有多個類別標籤),例如根據基因特徵來判斷其功能分類,kNN比SVM的表現要好。
4.2、缺點
  (1) 懶惰演算法,對測試樣本分類時的計算量大,記憶體開銷大;
  (2) 可解釋性較差,無法給出決策樹那樣的規則。
  (3) 該演算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。 該演算法只計算“最近的”鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響執行結果。

五、改進演算法
  針對以上演算法的不足,演算法的改進方向主要分成了分類效率和分類效果兩方面。
  (1)分類效率:事先對樣本屬性進行約簡,刪除對分類結果影響較小的屬性,快速的得出待分類樣本的類別。該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。
  (2)分類效果:採用權值的方法(和該樣本距離小的鄰居權值大)來改進,Han等人於2002年嘗試利用貪心法,針對檔案分類時做可調整權重的k最近鄰居法WAkNN (weighted adjusted k nearest neighbor),以促進分類效果;而Li等人於2004年提出由於不同分類的檔案本身有數量上有差異,因此也應該依照訓練集合中各種分類的檔案數量,選取不同數目的最近鄰居,來參與分類。