[英]Approximate nearest neighbor algorithm for Octrees
有誰知道八叉樹這種近似最近鄰技術的起源(紙,書等)?
http://www.cs.ucdavis.edu/~amenta/w11/nnLecture.pdf
我無法從提供的偽代碼中實現它。 我也很難找到該技術的原始出版物,我希望它有更多細節。
謝謝你的幫助。
這不是確切的答案,而是一個近似值(使用主題的術語:))。
太大了,無法發表評論,我認為這是一個很好的起點。
該論文提到,Voronoi圖的展開維數沒有超過三個,並且暗示八叉樹可以展開。 就術語而言,這是錯誤的。
在R ^ 3中定義了八叉樹。 簡單地說,您會看到2D的這種數據結構,其中有一個四叉樹 。 這些樹的每個節點有2 ^ D個子節點 ,其中D是維。 這意味着:
1. 2D: 2^D children per node, i.e. 4 children per node.
2. 3D: 2^D children per node, i.e. 8 children per node.
3. and so on.
對於exampe, octree
,源於希臘文辛,這意味着8,它指的是此樹有每個節點的8個孩子。
我已經為NN
(最近鄰居)實現了這種樹,即使我將樹做成多態的,也不會浪費任何內存,但這不會擴展到10維以上。
此外,本文還提到了kd-trees
。 注意,當維度變大時,查詢時間不再是O(logn)
,而是比蠻力法(即檢查所有點)略短。 尺寸越高, kd-trees
性能越差。
kd-tree
實際上是嵌入幾何中的二叉樹。 我的意思是,每個節點都有兩個孩子,並且在每個級別上,我們將數據集減半(通常在方差最大的坐標中間,以便我們可以利用數據集的結構)。 這將形成一棵完美的樹。
在這里,您可以看到一個kd-tree
,它是我的一個朋友,在8D中得到64點。 在此版本中,我們每個葉子存儲4點。
框中的數字表示點號(從1開始,即test.points文件中的行號)。
符號“ 8 @ 0.532”是指一個內部節點,其中的數據沿第八維(同樣,維從1開始,以便於人類理解)在0.532處拆分。
因此,我們傾向於關注近似NN ,這意味着我們付出了一些准確性上的損失,但是卻獲得了一定的提速。 (您可能知道,一切都是折衷的)。
按Box ,它可能意味着一個minimum bounding box
。
這很簡單,這是一個示例:
假設您具有2D數據集:
-1 -2
0 5
8 -5
為了構造邊界框,我們需要找到每個維度上的最小和最大坐標。 請注意,對於存儲Boudning框,足以存儲其最小和最大角。
在這里,我們有min = (-1, -5) and max = (8, 5)
。 這樣,邊界框將按照順時針方向形成,即從最大角開始,即具有角的矩形:
( 8, 5) // ( max.x, max.y)
( 8, -5) // ( max.x, min.y)
(-1, -5) // ( min.x, min.y)
(-1, 5) // ( min.x, max.y)
請注意,數據集的所有點都位於此邊界框內。
至於論文,實際上是演講,而不是論文。 它沒有解釋如何編寫算法。 而且,它沒有提供任何獨特的信息來嘗試查找另一個.pdf,該信息在鏈接中更詳細地說明了.pdf。
[編輯] OP的評論。
1)Q: dequeue box B, containing representative point p
我要說的是,出隊意味着提取隊列的“第一個”元素。 入隊,意味着將隊列中的元素推回。 隊列縫將邊界框作為元素。
2)Q: r = d(q,B)
也許,他的意思是從盒子的角度說。 不清楚。
您可以計算從查詢點到框的最近角或框的代表的(歐幾里得)距離。
3) for all children B' of B containing points in P
P
是數據集。 每個框都在每個級別上划分為8個子框(對於octree)。
4)Q: while dN >= (1+e)r do
近似誤差e
實際上是我們所謂的epsilon
。 它通常是一個參數,表示在檢查時:
while delta >= r do
你不那么嚴格,你就做
while delta >= (1 + e)*r do
這意味着您進入循環的時間少於上述確切條件的時間。 因此,我認為這是說要在隊列中插入框B的每個子框。 恕我直言,這不是那么聰明。
關於e = 0.01的最后一條注釋,只需在上述條件下進行數學運算即可。 您將看到答案是否定的,因為作為發布鏈接的狀態, e
是一個乘法因子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.