KNN-筆記(2)

1 - kd Tree

KD樹是一種對K維空間中的實例點進行存儲以便對其進行快速檢索的樹形數據結構。KD樹其實就是二叉樹,表現爲對K維空間的一個劃分,構造kd樹至關於不斷的用垂直於座標軸的超平面將k維空間切分,構成一系列的k維超矩形區域,即kd樹就是二叉樹在高維上的擴展。kd樹的每一個節點最後對應於一個k維超矩形區域。kd樹搜索的平均計算複雜度是\(O(logN)\)。假如維度是k, 而樣本點一共N個,那麼最好是\(N >> 2^k\)。不然kd樹基於維度須要回溯比較的次數基本等同於線性一個個比較的次數。因此這時候一般會使用如sift中的近似最近鄰方法(best-bin-first search),也就是不須要找到最匹配的那些樣本點,而是放棄必定的精度來加快速度。html

在看別人博客的時候,發現對KD樹有2種不一樣理解,一種如統計學習方法中說的,樹中內部節點也是樣本點,如這裏;而另外一種,樹內部的節點是劃分點,樣本點全都在葉子節點上,如這裏數據結構

1.1 - 構造過程
這裏先介紹內部節點是樣本點的構造過程
構造過程;假設訓練集一共\(n\)個樣本點,每一個樣本點特徵維度都是\(k\)
1)構造根節點:先計算全部樣本第1維組成的向量的中位數。而後將該中位數表示的樣本做爲根節點\(r_0\);將該維度上小於中位數的樣本點劃分到左子樹\(RL\);大於該中位數的樣本點劃分到右子樹\(RR\)
2)構造後續節點:對於步驟1)劃分到左子樹的全部樣本點,按照它們第2維度找中位數,並將中位數對應的樣本做爲該子樹的根節點\(r_{1l}\),將小於該中位數的樣本點劃分到該子樹對應的左子樹,大於的劃分到該子樹對應的右子樹;
經過不斷的找中位數表示的樣本,不斷的對k維空間進行分割,直到兩邊子樹只剩下一個樣本做爲葉子節點。這樣的kd樹是平衡的,不過卻不必定是最優的。app

ps:(1)當劃分層數太深,而維度不夠用時,從頭開始,即從第1維接着開始; (2)樹的每一個節點都對應一個樣本。學習

拿《統計學習方法》例3.2來講,假設訓練集樣本有{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}
第0層根節點,找第1維中位數對應樣本點:[2,4,5,7,8,9],中位數從[5,7]中挑中7,得當前根節點爲(7,2),分得左子樹{(2,3),(4,7),(5,4)};右子樹{(8,1),(9,6)}
第1層根節點,找第2維中位數對應樣本點:左子樹:[3,4,7]-4;右子樹[1,6]-6。分得第1層
左子樹{(2,3)}【(5,4)】{(4,7)};右子樹{(8,1)}【(9,6)】
第2層,由於第一層分割後只剩下每一個根節點對應的左右子樹都只有一個樣本,做爲葉子節點,因此無需再分,結果以下圖:
spa


圖1.1 二維狀況下的kd樹構造例子

ps:這樣雖然獲得的樹是平衡的,不過以爲不利於搜索。而如 這裏:在軸的選取上採用方差最大的那個軸做爲當前軸是個較好的方法,不過這有一點就是,在當前軸劃分以後,不一樣空間中的樣本點的最大方差軸可能會變。因此就須要每一次劃分都去從新計算每一個軸的方差,並選取最大軸,而後選取中位數,可見比軸輪詢的方式多了一步,更耗時了,有利有弊。

1.1.1 - 3維空間中的kd樹
rest


圖1.2 三維狀況下的kd-樹空間劃分。首先是x軸的紅色超平面將3維空間劃分紅2個子空間,而後每一個子空間中,基於z軸的綠色超平面接着各自劃分紅2個子空間.這時候有四個子空間了,最後基於y軸的藍色超平面將每一個空間劃分紅2個子空間。該圖是基於座標軸的輪詢,且不重複劃分,因此多少個座標軸,就劃分幾回,這時候一共8個子空間.

如上圖所示,kd樹就是基於二叉樹的多維空間劃分。

1.2 - 搜索過程htm

這裏以全部樣本點爲葉子節點作說明,葉子節點不參與中間的空間劃分 (因懶於畫圖,直接找到了別人的圖[3])
步驟:
blog


圖2.1 2維狀況下kd樹構造

如上圖所示,是一個基於2維狀況下構造好的kd樹,其中較爲清楚的說明了每一次劃分時候選取的軸,能夠看出這裏採用的是方差最大的形式。
2.1 - 先找到最底層葉子節點

圖2.2 給定一個詢問點,找到最底層葉子節點g

上圖中,首先一直找到底,找到與其最接近的葉子節點g,並計算2點之間的距離(保持平方,不開根能夠節省運算),將當前距離做爲最近距離R(表示以詢問點爲圓心,R爲圓的半徑平方)。

2.2 - 往上回溯
ip


圖2.3 往上回溯

虛線表示往上回溯的步驟:
i)首先在獲得g點基礎上,計算詢問點(紅色方塊)與上一層即(y|s4)表示的超平面(二維上是線)之間的距離,看該點與該超平面的距離是否小於R,以此做爲是否須要到,g點的父節點,的另外一邊子樹搜索。由於小於R,因此須要過去搜索。
ii)以(y|s4)爲根節點,找左邊與詢問方塊最接近的葉子節點e,並計算當前的最近距離,由於與e的距離小於與g的距離,最近距離R被更新;
iii)如i)同樣進行往上回溯。
總結:因此在節點查找的過程,就是找到葉子節點,進行比對,而後往上回溯其父節點表示的超平面是否相交,而後將另外一邊子樹做爲新的查找kd樹對待。
這裏須要插入關於在與內部節點(超平面)比較的解釋

圖2.4 3維狀況下解釋

如上圖所示,假設黑點是詢問點,而綠點是y軸負方向那邊子空間中的一點,以黑點爲球心,畫一個r半徑的圓。咱們想要知道是否須要去,以藍色爲分割超平面,的另外一邊去尋找(即綠點)?在點之間計算距離是每一個維度都須要計算的,而與超平面計算距離的時候,只須要計算該分割軸便可。通俗點說,就是黑點與綠點的距離是完整的距離計算,而黑點,與黑點綠點之間的藍色超平面,的距離只須要計算y軸上差值(記得平方)便可。

完整的過程以下面幾幅圖:get

圖2.5

圖2.6

圖2.7

2 - Ball Tree

參考資料:
[1] wiki,https://en.wikipedia.org/wiki/K-d_tree
[2] Beis, J.; Lowe, D. G. (1997). Shape indexing using approximate nearest-neighbour search in high-dimensional spaces. Conference on Computer Vision and Pattern Recognition. Puerto Rico. pp. 1000–1006
[3]Thinh Nguyen, Oregon State University. Lecture 13+: Nearest Neighbor Search (網頁打不開可迅雷下載)

相關文章
相關標籤/搜索