域名
|
數據類型
|
描述
|
Node-data
|
數據矢量
|
數據集中某個數據點,是n維矢量(這裏也就是k維)
|
Range
|
空間矢量
|
該節點所表明的空間範圍
|
split
|
整數
|
垂直於分割超平面的方向軸序號
|
Left
|
k-d樹
|
由位於該節點分割超平面左子空間內全部數據點所構成的k-d樹
|
Right
|
k-d樹
|
由位於該節點分割超平面右子空間內全部數據點所構成的k-d樹
|
parent
|
k-d樹
|
父節點
|
算法:構建k-d樹(createKDTree)
|
輸入:數據點集Data-set和其所在的空間Range
|
輸出:Kd,類型爲k-d tree
|
1.If Data-set爲空,則返回空的k-d tree
|
2.調用節點生成程序:
(1)肯定split域:對於全部描述子數據(特徵矢量),統計它們在每一個維上的數據方差。以SURF特徵爲例,描述子爲64維,可計算64個方差。挑選出最大值,對應的維就是split域的值。數據方差大代表沿該座標軸方向上的數據分散得比較開,在這個方向上進行數據分割有較好的分辨率;
(2)肯定Node-data域:數據點集Data-set按其第split域的值排序。位於正中間的那個數據點被選爲Node-data。此時新的Data-set' = Data-set\Node-data(除去其中Node-data這一點)。
|
3.dataleft = {d屬於Data-set' && d[split] ≤ Node-data[split]}
Left_Range = {Range && dataleft} dataright = {d屬於Data-set' && d[split] > Node-data[split]}
Right_Range = {Range && dataright}
|
4.left = 由(dataleft,Left_Range)創建的k-d tree,即遞歸調用createKDTree(dataleft,Left_
Range)。並設置left的parent域爲Kd;
right = 由(dataright,Right_Range)創建的k-d tree,即調用createKDTree(dataright,Right_
Range)。並設置right的parent域爲Kd。
|