- 簡介
kd-tree也叫k維樹,是k維二叉樹,是一種空間劃分的數(shù)據(jù)結(jié)構(gòu),常備用于高維空間搜索 。
- kd-tree的構(gòu)建
輸入:無序化的點(diǎn)云,維度為k。
輸出:數(shù)據(jù)對(duì)應(yīng)的kd-tree。
步驟:
① 初始化分割軸:對(duì)每個(gè)維度的數(shù)據(jù)進(jìn)行方差的計(jì)算,取最大方差的維度作為分割軸,標(biāo)記為r;
② 確定節(jié)點(diǎn):對(duì)當(dāng)前數(shù)據(jù)按分割軸維度進(jìn)行檢索,找到中位數(shù)數(shù)據(jù),將其放入到當(dāng)前節(jié)點(diǎn)上;
③ 劃分雙支:劃分左支:在當(dāng)前分割軸維度,所有小于中位數(shù)的值劃分到左支中;
劃分右支:在當(dāng)前分割軸維度,所有大于等于中位數(shù)的值劃分到左支中;
④ 更新分割軸:r = (r+1)% k,首先r從0開始,0表示x軸;然后r = (0+1)%2=1;然后r = (1+1)%2 = 0,表示在沿著最后一個(gè)維度進(jìn)行分割之后再重新回到第一個(gè)維度。
⑤ 確定子節(jié)點(diǎn):確定左節(jié)點(diǎn):在左支的數(shù)據(jù)中進(jìn)行步驟2;
確定右節(jié)點(diǎn):在右支的數(shù)據(jù)中進(jìn)行步驟2;
這樣就構(gòu)成了一個(gè)完整的kd-tree。
- 舉例
有一組二維數(shù):{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}
構(gòu)建步驟:
① 初始化分割軸:
發(fā)現(xiàn)X軸的方差較大,所以最開始的分割軸為x軸。
② 確定當(dāng)前的節(jié)點(diǎn):
對(duì)x軸的數(shù){2, 5, 9, 4, 8, 7}找中位數(shù),發(fā)現(xiàn)5和7 都可以(選擇左右都無影響),這里選擇7,也就是(7,2)作為節(jié)點(diǎn)。
③ 劃分雙支數(shù)據(jù)
在x軸維度上,比較和7的大小,進(jìn)行劃分:
左支:{(2,3),(5,4),(4,7)}
右支:{(9,6),(8,1)}
④ 更新分割軸
例子中只有兩個(gè)維度,所以下一個(gè)軸是y軸
⑤ 確定子節(jié)點(diǎn)
左節(jié)點(diǎn):在左支中找到y(tǒng)軸的中位數(shù)4,即(5,4),所以左支數(shù)據(jù)更新為{(2,3)},右支數(shù)據(jù)更新為:{(4,7)}
右節(jié)點(diǎn):在右支中找到y(tǒng)軸的中位數(shù)6,即(9,6),所以左支數(shù)據(jù)更新為{(8,1)},右支數(shù)據(jù)為null
⑥ 更新分割軸:
下一個(gè)維度為x軸
⑦ 確定(5,4)的子節(jié)點(diǎn)
左節(jié)點(diǎn):由于只有一個(gè)數(shù)據(jù),所以左節(jié)點(diǎn)為(2,3)
右節(jié)點(diǎn):由于只有一個(gè)數(shù)據(jù),所以右節(jié)點(diǎn)為(4,7)
⑧ 確定(9,6)的子節(jié)點(diǎn)
左節(jié)點(diǎn):由于只有一個(gè)數(shù)據(jù),所以左節(jié)點(diǎn)為(8,1)
右節(jié)點(diǎn):空
最終得到了整個(gè)kd-tree
- 最近鄰
① 舉例:查找(2.1,3.1)的最近鄰
② 首先計(jì)算當(dāng)前節(jié)點(diǎn)的距離,scipy庫中的距離默認(rèn)使用歐式距離計(jì)算的,即p=2,也可以修改。
③ 首先計(jì)算(2.1,3.1)和(7,2)的距離(下面都用歐式距離):5.022,并且暫定為(7,2),根據(jù)當(dāng)前分割軸的維度(2.1<7),所以選擇左支。
④ 計(jì)算當(dāng)前節(jié)點(diǎn)(5,4)的距離:3.036,3.036<5.022,暫定為(5,4),根據(jù)當(dāng)前的分割維度(3.1<4),選左支。
⑤ 計(jì)算當(dāng)前節(jié)點(diǎn)(2,3)的距離:0.1414,暫定為(2,3),根據(jù)當(dāng)前分割軸維度(2.1 > 2),選取右支,而右支為空,回溯上一個(gè)節(jié)點(diǎn)。
⑥ 計(jì)算(2.1,3.1)與(5,4)的分割軸{y = 4}的距離,如果0.14小于距離值,說明就是最近值。如果大于距離值,說明,還有可能存在值與(2.1,3.1)最近,需要往右支檢索。
⑦ 由于0.14 < 0.9,我們找到了最近鄰的值為(2,3),最近距離為0.14。