KNN的優化演算法2 KD tree

2021-08-22 15:01:17 字數 2154 閱讀 8999

傳統knn缺點:資料量特別大時,需要計算參考點和每個樣本點的距離,計算量非常大,所以提出一種優化演算法-----kd-tree.

為了提高knn搜尋的效率,可以考慮使用特殊的結構儲存訓練資料,以減小計算距離的次數。

kd樹(k-dimension tree)是一種對k維空間中的例項點進行儲存以便對其進行快速檢索的樹形資料結構。kd樹是是一種二叉樹,表示對k維空間的乙個劃分,構造kd樹相當於不斷地用垂直於座標軸的超平面將k維空間切分,構成一系列的k維超矩形區域。kd樹的每個結點對應於乙個k維超矩形區域。利用kd樹可以省去對大部分資料點的搜尋,從而減少搜尋的計算量。

輸入:多維空間資料集

輸出:kd樹

(1)開始:構造根結點。選擇x為切分座標軸,以所有例項x座標的中位數為切分點,將根結點對應的區域切分為左、右兩個子區域。左子結點對應座標小於切分點的子區域,右子結點對應於座標大於切分點的子區域。將落在切分超平面上的例項點儲存在根結點。

(2)重複。對左右子區域,輪換切分座標軸,繼續以座標軸對應座標的中位數為切分點。直到所有的點都切分完畢。

舉個簡單的例子:

例. 給定乙個二維空間資料集,構造乙個平衡kd樹。

解:根結點對應包含資料集t的矩形,選擇軸,6個資料點的座標中位數是6,這裡選最接近的(7,2)點,以平面將空間分為左、右兩個子矩形(子結點);接著左矩形以分為兩個子矩形(左矩形中點的座標中位數正好為4),右矩形以分為兩個子矩形,如此遞迴,最後得到如下圖所示的特徵空間劃分和kd樹。

利用kd樹可以省去對大部分資料點的搜尋,從而減少搜尋的計算量。下面以搜尋最近鄰點為例加以敘述:給定乙個目標點,搜尋其最近鄰,首先找到包含目標點的葉節點;然後從該葉結點出發,依次回退到父結點;不斷查詢與目標點最近鄰的結點,當確定不可能存在更近的結點時終止。這樣搜尋就被限制在空間的區域性區域上,效率大為提高。

用kd樹的最近鄰搜尋:  

輸入: 已構造的kd樹;目標點; 

輸出:最近鄰。

(1) 在kd樹中找出包含目標點的葉結點:從根結點出發,遞迴的向下訪問kd樹。若目標點當前維的座標值小於切分點的座標值,則移動到左子結點,否則移動到右子結點。直到子結點為葉結點為止;

(2) 以此葉結點為「當前最近點」;

(3) 遞迴的向上回退,在每個結點進行以下操作:

(a) 如果該結點儲存的例項點比當前最近點距目標點更近,則以該例項點為「當前最近點」;

(b) 當前最近點一定存在於該結點乙個子結點對應的區域。檢查該子結點的父結點的另乙個子結點對應的區域是否有更近的點。具體的,檢查另乙個子結點對應的區域是否與以目標點為球心、以目標點與「當前最近點」間的距離為半徑的超球體相交。如果相交,可能在另乙個子結點對應的區域內存在距離目標更近的點,移動到另乙個子結點。接著,遞迴的進行最近鄰搜尋。如果不相交,向上回退。

(4) 當回退到根結點時,搜尋結束。最後的「當前最近點」即為的最近鄰點。

注意:這裡的搜尋,也是跟上邊構造一樣,首先先搜尋x(1),再搜尋x(2)..以此類推下去。

以先前構建好的kd樹為例,查詢目標點(3,4.5)的最近鄰點。同樣先進行二叉查詢,先從(7,2)查詢到(5,4)節點,在進行查詢時是由y = 4為分割超平面的,由於查詢點為y值為4.5,因此進入右子空間查詢到(4,7),形成搜尋路徑:(7,2)→(5,4)→(4,7),取(4,7)為當前最近鄰點。以目標查詢點為圓心,目標查詢點到當前最近點的距離2.69為半徑確定乙個紅色的圓。然後回溯到(5,4),計算其與查詢點之間的距離為2.06,則該結點比當前最近點距目標點更近,以(5,4)為當前最近點。用同樣的方法再次確定乙個綠色的圓,可見該圓和y = 4超平面相交,所以需要進入(5,4)結點的另乙個子空間進行查詢。(2,3)結點與目標點距離為1.8,比當前最近點要更近,所以最近鄰點更新為(2,3),最近距離更新為1.8,同樣可以確定乙個藍色的圓。接著根據規則回退到根結點(7,2),藍色圓與x=7的超平面不相交,因此不用進入(7,2)的右子空間進行查詢。至此,搜尋路徑回溯完,返回最近鄰點(2,3),最近距離1.8。

1.如何決定每次根據哪個維度對子空間進行劃分呢?

2.如何選定根節點的比對數值呢?

PCL系列2 Kd Tree的使用

include kdtree近鄰搜尋 include 檔案輸入輸出 include 點型別相關定義 include 視覺化相關定義 include include int main 2.原始點雲著色 for size t i 0 i cloud points.size i 3.建立kd tree p...

knn基礎與優化1 kd tree

knn k nearest neighbours k最近鄰演算法,是乙個基於距離的有監督演算法,常被用於分類問題的演算法,它也可以用於回歸問題。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個資料點都可以用它最接近的k個鄰居資料點來代表。當用於分類時,用k個最近鄰居所屬類別的多數做 結果 當用於回...

KNN演算法優化

在之前所寫的knn演算法python實現裡,knn對k的選取很敏感,因為它給所有的近鄰分配相同權重,無論距離測試樣本有多遠。為了降低該敏感性,可以使用加權knn,給更近的近鄰分配更大的權重,給較遠的樣本權重相應減少。gaussian函式可以實現這一點,如下圖所示。python實現 def gauss...