K-近鄰學習(KNN)

KNN 分類學習算法

K近鄰學習算法是一種基本的分類與迴歸學習算法,能力有限,簡單介紹一下分類算法。K近鄰學習算法是一種常用的監督學習算法。

算法機制

給定測試樣本,基於某種距離度量找出訓練集中的與其最靠近的K個訓練樣本,然後基於找到的K個近鄰訓練樣本的類別信息來預測測試樣本的類別。在分類任務中,一般採用投票法決定類別信息,根據K個近鄰樣本中出現最多的類別作爲測試樣本的類別。

算法特點

K-近鄰算法沒有明顯的訓練過程,是“懶惰學習”的著名代表。在訓練階段只保存訓練樣本的信息,並沒有相關參數的訓練。在測試時,將測試樣本與每個訓練樣本進行比較,計算距離。算法中最重要的一個參數就是 K ,對於不同的K的選擇,可能會有不同的結果,當 K = 1 時,稱爲最近鄰算法。

K 值的選擇

  1. 當 K 選擇較小時,就相當於用較小的領域中的訓練樣本對測試樣本進行預測,學習的“近似誤差”會小,只有與測試樣本較近的訓練樣本纔會參與預測,但是,學習的“估計誤差”會增大。預測結果會對近鄰的實例很敏感,如果近鄰的樣本恰是噪聲,則會引起誤判。
    總之,K值越小,意味着整體模型越複雜,容易發生過擬合現象。
  2. 當 K 選擇較大時,就相當於用較大的領域中的訓練樣本對測試樣本進行預測,可以減小學習的“估計誤差”,但是學習的“近似誤差”會增大。這時,與輸入樣本相差較遠的樣本點也會參與預測的過程,使預測發生錯誤。
    K的增大,意味着整體模型變簡單,但是模型過於簡單會忽略大量的有用信息,是分類器的性能下降。

在實際應用中,K 一般取一個較小的值。通常採用交叉驗證來選取最優的 K 值。

近似誤差:可以理解爲對現有訓練集的訓練誤差
估計誤差:可以理解爲對測試集的測試誤差
    近似誤差關注訓練集,近似誤差過小會容易出現過擬合現象,估計誤差關注測試集和泛化問題,估計誤差小,說明對未知數據的預測能力較好。

K近鄰的實現

  1. 線性掃描
    K 近鄰最簡單的實現方法就是線性掃描,即,計算測試樣本與每一個訓練樣本的距離,易於實現,但是當訓練樣本很多的時候,則計算量大,計算耗時。

  2. kd樹
    爲了提高搜索效率,可以改變訓練樣本的存儲方式,減少距離的計算次數。kd樹則是一種簡化的方法,kd樹是一種對K維空間的實例點進行存儲,以便於進行快速搜索的樹形數據結構,kd樹是二叉樹,表示對k爲空間的一個劃分。

  3. 構造kd樹
    構造根結點,使根結點對應於K維空間中包含所有實例的超矩形區域,通過遞歸方法不斷的對K維空間進行劃分,生成子結點。通常選擇座標做進行切分,選擇訓練樣本中在選定的座標軸上的中位數爲切分點,所得的kd樹是平衡的。

    平衡kd樹,在搜索時效率未必是最優的
    
  4. 搜索kd樹
    利用kd樹可以省去大部分的數據點的搜索,從而減少計算量。
    給定一個目標,搜索其最近鄰,首先找到包含目標點的葉結點,然後從該葉結點出發,依次回退到父結點,不斷查找與目標結點最鄰近的結點,當確定不可能存在更近的結點時終止。

    實現算法;
    輸入:已構造的kd樹,目標點 x ;
    輸出: x 的最近鄰;
    
    1、在kd樹中找到包含目標點的葉結點,從根結點出發,遞歸的向下訪問kd樹,若目標點當前維的座標小於切分點的座標,則移動到左子結點,否則移動到右子結點,知道子結點爲葉結點爲止。
    2、以此葉結點爲當前最近結點。
    3、遞歸向上回退,在每個結點進行以下操作:
        3.1、如果該結點保存的實例點比當前最近點距離目標點更近,則以該點爲當前最近點
        3.2、當前最近點一定存在於該結點一個子結點對應的區域,檢查該子結點的父結點的另一子結點對應的區域是否有更近的點
    4、當回退到根結點時,搜索結束,當前最近點成爲最近鄰點。
    

參考文獻

  1. 李航,統計學習方法
  2. 周志華,機器學習
  3. 百度百科-kd樹

能力有限,如有不足,望博友不吝告知,將不勝感激。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章