Kd樹
實現k近鄰法時,主要考慮的問題是如何對訓練數據進行快速的k近鄰搜索。k近鄰法最簡單有效的方法是線性掃描(窮舉搜索),即要計算輸入實例與每一個訓練實例的距離,再查找k近鄰,當訓練數據很大時,計算非常耗時,為提高KNN搜索效率,就引入了kd樹的概念。
Kd樹原理其實跟二分查找是一樣的,比如上面這些數,我要查找0這個數,我先把上面這些數進行排序,找到中間的那個樹為2,因0比2小,所以接下來查找的是-2--0這個區間的數據,另半邊就無需查找,在-2--0之間再進行二分取中間的樹為-1,0比-1大,這樣就確定了0這個數。
上圖中,黃色的點作為根節點,上面的點作為左子樹,下面的點作為右子樹,接下來不斷地划分,分割的那條線叫作分割超平面,在一維中是點,二維中是線,三維中是面
kd樹是一種對k維空間中的實例點進行存儲以便對其進行快速檢索的樹形結構。Kd樹是一種二叉樹,表示對k維空間的一個划分,構造kd樹相當於不斷地用垂直於坐標軸的超平面對k維空間進行切分,構成一系列的k維超矩形區域。kd樹的每個結點對應於一個k維超矩形區域。Kd樹的每個結點對應於一個k維超矩形區域。利用kd樹可以省去對大部分數據的搜索,從而減少搜索時間
kd樹的構造方法:
(1)、構造根結點,使根結點對應於k維空間中包含所有實例點的矩形區域。
(2)、對過遞歸方法,不斷對k維空間進行切分,生成子結點。在超矩形區域上選擇一個坐標軸和在此坐標軸上 的一個切分點,確定一個超平面,這個超平面通過選定的切分點並垂直於選定的坐標軸,將當前超矩形區域切分為左右兩個子區域(子結點);這時,實例被分到兩個區域
(3)、上述過程直到子區域沒有實例終止(終止時的結點為葉結點),在此過程中,將實例保存在相應的結點上。
(4)、通常,循環的選擇坐標對空間切分,選擇訓練實例點在坐標軸上的中位數為切分點,這樣得到的kd樹是平衡的(平衡二叉樹:它是一顆空樹,或其左子樹和右子樹的深度之差的絕對值不超過1,且它的左子樹和右子樹是平衡二叉樹)
KD樹中每個節點都是一個向量,和二叉樹划分不同的是,kd樹每層需要選定向量中 的某一維,然后根據這一維左小右大的方式划分數據。在構建二叉樹時,有兩個問題需要解決:
(1)、選擇向量的哪一維進行划分
(2)、如何划分 數據
解決上述問題的關鍵是每次選擇中位數來進行划分