KNN最近鄰

概要

  1. 是一種分類算法。
  2. 給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的k個實例,這k個實例的多數屬於某個類,就把該輸入實例分爲這個類。

 

應用場景:

   分類。

 

優點:

  1. 簡單,易於實現,無需估計參數,無需訓練。
  2. 新樣本添加無需訓練,是在線更新。

 

缺點:

  1. KNN算法是懶惰學習方法,分類的速度比積極學習算法慢得多
  2. 樣本數量不平衡時,容易誤分類。
  3. 計算量較大。

 

 

K近鄰模型由3個基本要素——距離度量、k值的選擇和分類決策規則決定

 

 

距離度量一般使用L-2歐式距離來計算

 

k值的選擇: 如果選擇較小的k值,“估計誤差“會增大,預測結果會對近鄰的實例點非常敏感,假如近鄰的實例點中存在噪聲,那麼噪聲也會對預測產生負面影響。

如果選擇較大的k值,”近似誤差“會增大,這時與輸入實例較遠的(不相似的)訓練實例也會對預測起作用,使預測發生錯誤。

在應用中,k值一般取一個比較小的數值。通常採用交叉驗證 法來選取最優的k值。

 

分類決策規則:通常採用多數表決,即由輸入實例的k個近鄰的訓練實例中的多數類決定輸入實例的類。

 

kd樹是提高k近鄰搜索的效率的方法

 

kd樹的構建方法

 

舉一個簡單直觀的實例來介紹k-d樹構建算法。假設有6個二維數據點{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},數據點位於二維空間內,如下圖所示。爲了能有效的找到最近鄰,k-d樹採用分而治之的思想,即將整個空間劃分爲幾個小部分,首先,粗黑線將空間一分爲二,然後在兩個子空間中,細黑直線又將整個空間劃分爲四部分,最後虛黑直線將這四部分進一步劃分。

    6個二維數據點{(2,3)(5,4)(9,6)(4,7)(8,1)(7,2)}構建kd樹的具體步驟爲:

  1. 確定:split域=x。具體是:6個數據點在x,y維度上的數據方差分別爲39,28.63,所以在x軸上方差更大,故split域值爲x;
  2. 確定:Node-data = (7,2)。具體是:根據x維上的值將數據排序,6個數據的中值(所謂中值,即中間大小的值)爲7,所以Node-data域位數據點(7,2)。這樣,該節點的分割超平面就是通過(7,2)並垂直於:split=x軸的直線x=7;
  3. 確定:左子空間和右子空間。具體是:分割超平面x=7將整個空間分爲兩部分:x<=7的部分爲左子空間,包含3個節點={(2,3),(5,4),(4,7)};另一部分爲右子空間,包含2個節點={(9,6),(8,1)};

   如上算法所述,kd樹的構建是一個遞歸過程,我們對左子空間和右子空間內的數據重複根節點的過程就可以得到一級子節點(5,4)和(9,6),同時將空間和數據集進一步細分,如此往復直到空間中只包含一個數據點。

   與此同時,經過對上面所示的空間劃分之後,我們可以看出,點(7,2)可以爲根結點,從根結點出發的兩條紅粗斜線指向的(5,4)和(9,6)則爲根結點的左右子結點,而(2,3),(4,7)則爲(5,4)的左右孩子(通過兩條細紅斜線相連),最後,(8,1)爲(9,6)的左孩子(通過細紅斜線相連)。如此,便形成了下面這樣一棵k-d樹:

 

 

 

 

 

kd樹的最近鄰算法:

 

輸入:已構造的kd樹,目標點x;

輸出:x 的最近鄰

算法步驟如下:

  1. 在kd樹種找出包含目標點x的葉結點:從根結點出發,遞歸地向下搜索kd樹。若目標點x當前維的座標小於切分點的座標,則移動到左子結點,否則移動到右子結點,直到子結點爲葉結點爲止。
  2. 以此葉結點爲“當前最近點”。
  3. 遞歸的向上回溯,在每個結點進行以下操作:
    (a)如果該結點保存的實例點比當前最近點距離目標點更近,則更新“當前最近點”,也就是說以該實例點爲“當前最近點”。
    (b)當前最近點一定存在於該結點一個子結點對應的區域,檢查子結點的父結點的另一子結點對應的區域是否有更近的點。具體做法是,檢查另一子結點對應的區域是否與以目標點爲球心,以目標點與“當前最近點”間的距離爲半徑的圓或超球體相交。
    如果相交,可能在另一個子結點對應的區域內存在距目標點更近的點,移動到另一個子結點,接着,繼續遞歸地進行最近鄰搜索;
    如果不相交,向上回溯。
  4. 當回退到根結點時,搜索結束,最後的“當前最近點”即爲x 的最近鄰點。

 

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