1. 程式人生 > >K近鄰演算法(kNN)學習——kd樹

K近鄰演算法(kNN)學習——kd樹


    構造kd樹的過程我自己總結了一個口訣就是:“選擇中位數,一橫一豎”
    構造平衡kd樹演算法
    輸入:k維空間資料集T={x1,x2,...,xN},其中xi=(x(1)i,x(2)i,...,x(k)i)i=1,2...,N;
    輸出kd樹。
    (1)分別基於輸入的資料集,計算k維資料中方差最大的一維(也可以依次分割每一維度),為了便於介紹,本演算法以依次分割每一維度進行的,所以選擇x(1)為分割座標軸;
    (2)選擇x(1)為分割座標軸,以T中所有例項的x(1)座標的中位數為切割點,將根節點對應的超矩形區域切分為兩個子區域。切分由通過切分點並與座標軸x
(1)
垂直的超平面實現。
    由根節點生成深度為1的左、右子節點:左子節點對應座標x(1)小於切分點的子區域,右子節點對應於座標x(1)大於切分點的子區域。
    (3)重複步驟(2),對於深度為j的節點,選擇x(l)為切分點的座標軸,l=j(modk)+1,以該節點的區域切中所有例項的x(l)中位數為切分點,將該節點對應的超矩形區域切分為兩個子區域。切分由通過切分點並與座標軸x(l)垂直的超矩形實現。
    (4)停止條件:直到兩個子區域內沒有例項存在時停止。
    舉例:
    假設有6個二維資料點{2,3,5,49,64,78,17,
2}
,資料點位於二維空間內,如圖1:
    a)依次分割每一維度,因此先分割x軸;
    b)根據x軸方向的值2,5,9,4,8,7排序選出中值為7,所以以(7,2)為分割點。這樣,該節點的分割超平面就是通過(7,2)並垂直於x軸的直線x = 7;
    c)確定左子空間(x <= 7的部分)和右子空間(x > 7的部分)進行上面兩步遞迴操作直到空間中只包含一個數據點。最後生成的kd樹對應的空間劃分為圖1,kd樹如圖2。