【統計學習方法】 k近鄰法


k近鄰算法

算法(k近鄰法):

輸入:訓練數據集:

                         

 

輸出:實例x所屬的類y

(1)根據給定的距離度量,在訓練集中找到距離x最近的k個點,涵蓋這k個點的x的鄰域記為Nk(x)

(2)在Nk(x)中根據分類決策規則(如多數表決)決定x的類別y

                       

 

 k = 1時稱為最近鄰法。 k近鄰法沒有顯示的學習過程。

 

k近鄰模型

k鄰近法使用的模型對應於特征空間的划分。 當模型的三要素(距離度量、k值選擇、和分類決策規則)確定后, 對於任何一個實例,它所屬的類也確定下來。

 

距離度量

設特征空間X是n維實數向量空間R^n,的Lp距離定義為:

 

                             

 

p=2時,稱為歐氏距離(Euclidean Distance):

                              

 

 p=1時,稱為曼哈頓距離(Manhattan Distance):

                           

 

p=∞時,為各坐標距離的最大值:

                            

 

 

k值選擇

k值越小, 估計誤差越大, 對近鄰的實例越敏感, 整體模型變得復雜, 容易發生過擬合;

k值越大, 近似誤差越大, 模型變得簡單, 容易發生欠擬合。

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

 

分類決策規則

 往往采用多數表決

 

k近鄰算法的實現:kd樹

構造kd樹

kd樹是一種對k維空間中實例點進行儲存以便對其進行快速檢索的樹形數據結構。kd樹是二叉樹,表示對k維空間的一個划分。構造kd樹相當於不斷用垂直坐標軸的超平面將k維空間切分, 構成一系列k維超矩形區域。kd樹的每個節點對應一個超矩形區域。

算法(構造平衡kd樹)

輸入:k維空間數據集 

輸出:kd樹

(1)開始:構造根節點,根節點對應於包含T的k維空間超矩形區域。

選擇為坐標軸,以T中所有實例的坐標的中位數為切分點,將根節點對應的超矩形區域切分為兩個子區域。切分通過切分點並與坐標軸垂直的超平面實現。

 

由根節點生成深度為為1的左右節點:左子節點對應坐標小於切分點的子區域,右子節點對應坐標大於切分點的子區域

 

 將落在切分超平面上的實例點保存為根節點。

(2)重復:對深度為 j 的節點,選擇為切分的坐標軸,l = j(mod k)+ 1,以該節點的區域中所有實例的坐標的中位數為切分點,將該節點對應的超矩形區域切分為兩個子區域。切分通過切分點並與坐標軸垂直的超平面實現。

 

 由根節點生成深度為為 j 的左右節點:左子節點對應坐標小於切分點的子區域,右子節點對應坐標大於切分點的子區域

將落在切分超平面上的實例點保存為該節點。

(3)直到兩個子區域沒有實例存在時停止。從而形成kd樹的划分。

 

 搜索kd樹

算法(用kd樹的最鄰近搜索)

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

輸出:x的最近鄰

(1)在kd樹中找出包含目標點x 的葉節點:從根節點出發,遞歸向下訪問kd樹。若目標點x當前維的坐標小於切分點坐標,則移動當左子節點,否則移動到右子節點。直到子節點為葉節點為止。

(2)以此葉節點為“當前最近點”

(3)遞歸的向上回退,每個節點進行如下操作:

  (a)如果該節點保存的實例點比當前距離目標更近,則以該實例點為“當前最近點”

  (b)當前最近點一定存在於該節點的一個子節點對應區域。檢查該子節點的父節點的另一個子節點對應的區域是否有更近的點。具體地, 檢查另一子節點對應的區域是否以目標點為球心、目標點與“當前最近點”間的距離為半徑的超球體相交。

  如果相交, 可能在另一個節點對應區域存在更近點, 移動到另一個子節點。接着,遞歸地進行最近鄰搜索:

  如果不相交,向上回退。

(4)回退到根節點時,搜索結束。最后的 “當前最近點”即為x的最近鄰點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM