kd樹劃分空間選擇維度使用方差的好處

2021-08-08 21:59:08 字數 787 閱讀 7202

最近學習《統計學習方法》裡的kd樹時,雖然演算法的原理比較清晰,但是一直感覺選擇維度的時候使用j = (i mod k) + 1的輪替模式會導致空間分的太不均衡,可能導致搜尋kd樹的某些時候效率偏低。

在知乎上看到

使用方差來選擇維度,使用中值來作為結點取值,感覺這種做法可能能更好的劃分每個結點的左右子樹所代表的空間。

後來看到一篇部落格(中所使用的解釋方法既通俗又挺形象,所以摘取了其中片段:

最簡單的方法就是輪著來,即如果這次選擇了在第i維上進行資料劃分,那下一次就在第j(j≠i)維上進行劃分,例如:j = (i mod k) + 1。想象一下我們切豆腐時,先是豎著切一刀,切成兩半後,再橫著來一刀,就得到了很小的方塊豆腐。

可是「輪著來」的方法是否可以很好地解決問題呢?再次想象一下,我們現在要切的是一根木條,按照「輪著來」的方法先是豎著切一刀,木條一分為二,乾淨利落,接下來就是再橫著切一刀,這個時候就有點考驗刀法了,如果木條的直徑(橫截面)較大,還可以下手,如果直徑較小,就沒法往下切了。因此,如果k維資料的分布像上面的豆腐一樣,「輪著來」的切分方法是可以奏效,但是如果k維度上資料的分布像木條一樣,「輪著來」就不好用了。因此,還需要想想其他的切法。

如果乙個k維資料集合的分布像木條一樣,那就是說明這k維資料在木條較長方向代表的維度上,這些資料的分布散得比較開,數學上來說,就是這些資料在該維度上的方差(invariance)比較大,換句話說,正因為這些資料在該維度上分散的比較開,我們就更容易在這個維度上將它們劃分開,因此,這就引出了我們選擇維度的另一種方法:最大方差法(max invarince),即每次我們選擇維度進行劃分時,都選擇具有最大方差維度。

KD樹 BBF KNN使用C 實現(2)

在上一節中我們講解了kd的構造過程,這裡我們主要講解的kd的搜尋過程,如何查詢距離目標點最近的點。我們先把kd樹的最鄰近搜尋 knn 的 貼上出來 private node kdtreefindnearest node tree,train target else searchnode search...

使用k d樹進行無序點雲去噪

離散點雲的點之間是沒有拓撲結構的,因此為了找到它的幾何屬性,可以找到各點的鄰域結構。對於取樣點pi p定義其鄰域nk pi為取樣點pi 的最近的 k 個取樣點組成的集合,即k nearest neighbors。那麼尋找k nearest neighbours的方法主要由以下三種 八叉樹法 空間網格...

使用kd樹資料結構,實現k means聚類加速

主要的方法就是,將資料儲存在kd樹這種空間資料結構中,樹的思想類似於二叉搜尋樹 紅黑樹等,真的很強大 相信童靴們明白的 建立kd樹的過程,就是在多維資料點中,按照某一維度數值大小的中位數 中間值 不斷迴圈劃分空間,也就是超平面劃分空間,形成樹的層次結構。在傳統的knn演算法中,有很多的應用和說明。如...