1. 程式人生 > >第九章 KNN(K最近鄰分類演算法)

第九章 KNN(K最近鄰分類演算法)

1、惰性學習法

        說到惰性學習法,就要提到急切學習法。

        急切學習法:給定訓練集, 在接收待分類的新元祖(如檢驗元組)之前,就構造泛化(即分類)模型。如:決策樹歸納、貝葉斯分類、基於規則的分類、後向傳播分類、支援向量機和基於關聯規則挖掘的分類等。

        惰性學習法(也稱為基於例項的學習法):給定一個訓練元組,簡單地儲存它 (或只是稍加處理) ,一直等到給定一個檢驗元組。僅當看到檢驗元組時,它才進行泛化,以便根據儲存的訓練元組的相似性對該元組進行分類。

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

        缺點

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

        K近鄰演算法就是惰性學習法的例子。

2、K近鄰演算法(KNN演算法)

        k最近鄰分類法是20世紀50年代早期首次引進的。給定大量訓練集時,該方法是勞動密集的,直到20世紀60年代計算能力大大增強之後才流行起來。此後被廣泛用於模式識別領域。

        工作原理:存在一個樣本資料集合(訓練樣本集),並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料(最近鄰)的分類標籤。一般來說,我們只選擇樣本資料集中前k個最相似的資料。最後,選擇k個最相似資料中出現次數最多的分類,最為新資料的分類。

        例子:下圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果K=3,由於紅色三角形所佔比例為2/3,綠色圓將被賦予紅色三角形那個類,如果K=5,由於藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。

2.1  鄰近性的度量方法

        “鄰近性”用距離度量,距離越大,表示兩個點越不相似。

        計算距離的方法:歐幾里得距離、曼哈頓距離或其它距離。但多采用歐幾里得距離(簡單)。

        例:兩個點或元組X1=(x11,x12,...,x1n)和X2=(x21,x22,...,x2n)的歐幾里得距離是:

      

        換言之,對於每個數值屬性,取元組X1

和X2該屬性對應值的差,取差的平方並累計。並取累計距離計數的平方根。

2.2  屬性的數值規範化

        有助於防止具有較大初始值域的屬性(如收入)比具有較小初始值域的屬性(如二元屬性)的權重過大。

        例如,可以通過計算下式,使用最小—最大規範化將數值屬性A的值v變換到[0,1]區間中的v'

        其中minA和maxA分別是屬性A的最小值和最大值。

2.3  比較的屬性不是數值型別而是分類型別(如顏色),如何計算距離?

        對於分類屬性,一種簡單的方法是比較元組X1和X2中對應屬性的值。如果二者相同(例如,元組X1和X2都是藍色),則二者之間的差為0。如果二者不同(例如,元組X1是藍色,而元組X2是紅色),則二者之間的差為1。

        其他方法可採用更復雜的方案。(例如,對藍色和白色賦予比藍色和黑色更大的差值。)

2.4  缺失值的處理

        解決辦法:取最大的可能差。

        對於分類屬性,假設每個屬性都已經對映到[0,1]區間,如果屬性A的一個或兩個對應值丟失,則取差值為1;

        如果A是數值屬性,若兩個比較的元組屬性A的值均缺失,則取差值為1,若只有一個缺失,另一個存在並且已經規範化(記作v'),則取差值為|1-v'|和|0-v'|中的最大者。

2.5  確定近鄰數k的值

引用李航博士的書【統計學習方法】中的內容:

        K值的選擇會對k近鄰法的結果產生重大影響。

        如果選擇較小的K值,就相當於用較小的鄰域中的訓練例項進行預測,“學習”的近似誤差會減小,只有與輸入例項較近或相似的訓練例項才會對預測結果起作用。但缺點是“學習”的估計誤差會增大,預測結果會對近鄰的例項點非常敏感。如果近鄰的例項點恰巧是噪聲,預測就會出錯。換句話說,K值的減小就意味著整體模型變得複雜,容易發生過擬合。

        如果選擇較大的K值,就相當於用較大鄰域中的訓練例項進行預測。其優點是可以減少學習的估計誤差。但缺點是學習的近似誤差會增大。這時,與輸入例項較遠(不相似的)訓練例項也會對預測起作用,使預測發生錯誤。K值的增大就意味著整體的模型變得簡單。

        如果K=N,則完全不足取,因為此時無論輸入例項是什麼,都只是簡單的預測它屬於在訓練例項中最多的類。模型過於簡單,忽略了訓練例項中大量有用資訊。

        在實際應用中,K值一般取一個比較小的數值。例如採用交叉驗證法(簡單來說,就是一部分樣本做訓練集,一部分做測試集)來選擇最優的K值。

        引用【資料探勘概念與技術】中的內容:

         可以通過實驗確定。

         從k=1開始,使用檢驗集估計分類器的誤差率。重複該過程,每次k增值1,允許增加一個近鄰。選取產生最小誤差率的k。

         一般,訓練元組數越多,k的值越大。

2.6  對噪聲資料或不相關屬性的處理

        最近鄰分類法使用基於距離的比較,本質上賦予每個屬性相等的權重。因此,當資料存在噪聲或不相關屬性時,它們的準確率可能會受到影響。

        對屬性賦予相關性權重w,w越大說明屬性對分類的影響越相關。對噪聲資料可以將所在的元組直接cut掉。

2.7  演算法流程


2.8 演算法的改進策略

        最近鄰分類法在對檢驗元組分類時可能非常慢。如果D是具有|D|個元組的訓練資料庫,而k=1,則對一個給定的檢驗元組分類需要O(|D|)次比較。改進如下

3、kd

        上面“演算法的改進策略”已經提到了搜尋樹。

        其實,實現k近鄰演算法時,考慮的主要問題是如何對訓練資料進行快速k近鄰搜尋。這點在特徵空間的維數大及訓練資料容量大時尤其重要。

        K近鄰法最簡單的實現方法是線性掃描。這時要計算輸入例項與每一個訓練例項的距離。當訓練集很大時,計算耗時,這種方法是不可行的。

        為了提高k近鄰搜尋的效率,可以考慮使用特殊的結構儲存訓練資料,以減少計算距離的次數。具體方法很多,其中比較常見的是kd方法。

        Kd樹的詳細介紹:

        參見:

        1、李航博士的《統計學習方法》中的章節(k近鄰法的實現:kd樹)

        2、大牛的部落格

更多文獻:可以參見大牛的部落格