介紹KdTree演算法

2021-10-09 02:08:36 字數 1666 閱讀 6965

入門,學習kdtree:

首先,這是一種分割k維資料空間的資料結構,目的是能夠快速查詢某個資料,是一種帶有約束得二分查詢樹,能起到一種加速作用。首先插上這張圖,一張我看了n多部落格都用的經典圖:

在此處用最簡單得二維資料來介紹,其餘同。

假設有6個二維資料點,資料點 位於二維空間內(如圖1中黑點所示)。k-d樹演算法就是要確定圖1中這些分割空間的分割線(多維空間即為分割平面,一般為超平面)。

由於此例簡單,資料維度只有2維,所以可以簡單地給x,y兩個方向軸編號為0,1,也即split=。

(1)確定split域的首先該取的值。分別計算x,y方向上資料的方差得知x方向上的方差最大,所以split域值首先取0,也就是x軸方向;

(2)確定node-data的域值。根據x軸方向的值2,5,9,4,8,7排序選出中值為7,所以此點得資料值為(7,2)。這樣,該節點的分割超平面就是通過(7,2)並垂直於split = 0(x軸)的直線x = 7;

(3)確定左子空間和右子空間。分割超平面x = 7將整個空間分為兩部分,如圖2所示。x < = 7的部分為左子空間,包含3個節點;另一部分為右子空間,包含2個節點。

(4)k-d樹的構建是乙個遞迴的過程。然後對左子空間和右子空間內的資料重複根節點的過程就可以得到下一級子節點(5,4)和(9,6)(也就是 左右子空間的'根'節點),同時將空間和資料集進一步細分。如此反覆直到空間中只包含乙個資料點,如圖1所示。最後生成的k-d樹如圖3所示。

以上n行借鑑於部落格感謝。

然後介紹一下,我不懂得地方,右邊只有倆,那如何看中位數,來確定如何擷取呢?翻閱書後,得出,最高效的方法是,將指定維度得值放在根上,小於指定值得資料放於左邊,大於的放在右邊,然後重複此過程。

所以此過程總的來說,是根據方差和中位數找到(7,2)這個點,然後左邊那三放在一坨,右邊那倆放一坨。然後左邊那三根據方差和中位數再挑出乙個(5,4)放於次根,左邊的剩下那倆就甭分了,一左一右。

然後再看右邊那倆,根據方差後,y軸較大,然後根據大的在右邊,所以在為雙數時,大的數中挑大的,放右次根,然後兩個中較小的放左邊,只能放於次根得下面左側。

接下來就是查詢的操作。基本的思路很簡單:首先通過二叉樹搜尋(比較待查詢節點和**節點的**維的值,小於等於就進入左子樹分支,等於就進入右子樹分支直到葉子結點),順著「搜尋路徑」很快能找到最近鄰的近似點,也就是與待查詢點處於同乙個子空間的葉子結點;然後再回溯搜尋路徑,並判斷搜尋路徑上的結點的其他子結點空間中是否可能有距離查詢點更近的資料點,如果有可能,則需要跳到其他子結點空間中去搜尋(將其他子結點加入到搜尋路徑)。重複這個過程直到搜尋路徑為空。

此例中先從(7,2)點開始進行 二叉查詢,然後到達(5,4),最後到達(2,3),此時搜尋路徑中的節點為,首先以(2,3)作為 當前最近鄰點,計算其到查詢點(2.1,3.1)的距離為0.1414,然後回溯到其父節點(5,4),並判斷在該父節點的其他子節點空間中是否有距離查 詢點更近的資料點。以(2.1,3.1)為圓心,以0.1414為半徑畫圓,如下圖所示。發現該圓並不和超平面y = 4交割,因此不用進入(5,4)節點右子空間中去搜尋。

以上參考自

感謝,具體**函式說明直接見上,寫這篇blog來提醒自己。

kdTree介紹以及PCL示例

kdtree概念 kd tree或者k維樹是電腦科學中使用的一種資料結構,用來組織表示k維空間中點的集合。它是一種帶有其他約束條件的二分查詢樹。kd tree對於區間和近鄰搜尋十分有用。一般位於三維空間中的鄰域搜尋常用kd tree,因此本文中所有的kd tree都是三維的kd tree。圖一kd ...

Python之kdtree庫函式介紹

使用anaconda的命令列安裝 conda install kdtree函式名 輸入引數 函式功能 node data,left,right 結點資料 左子結點 右子結點 建立結點例項 node.is leaf 返回布林值,判斷是否為葉子結點 node.preorder 結點處先序遍歷,返回乙個迭...

KNN的優化演算法2 KD tree

傳統knn缺點 資料量特別大時,需要計算參考點和每個樣本點的距離,計算量非常大,所以提出一種優化演算法 kd tree.為了提高knn搜尋的效率,可以考慮使用特殊的結構儲存訓練資料,以減小計算距離的次數。kd樹 k dimension tree 是一種對k維空間中的例項點進行儲存以便對其進行快速檢索...