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的最近鄰點。
