k近鄰算法——球樹

一、概念

KD樹算法雖然提高了KNN搜索的效率,但是在某些時候效率並不高,比如當處理不均勻分佈的數據集時,不管是近似方形,還是矩形,甚至正方形,都不是最好的使用形狀,因爲他們都有角。一個例子如下圖:
在這裏插入圖片描述
如果黑色的實例點離目標點星點再遠一點,那麼虛線圓會如紅線所示那樣擴大,導致與左上方矩形的右下角相交,既然相 交了,那麼就要檢查這個左上方矩形,而實際上,最近的點離星點的距離很近,檢查左上方矩形區域已是多餘。於此我們看見,KD樹把二維平面劃分成一個一個矩形,但矩形區域的角卻是個難以處理的問題。

爲了優化超矩形體導致的搜索效率的問題,牛人們引入了球樹,這種結構可以優化上面的這種問題。

二、球樹的構建

球樹,顧名思義,就是每個分割塊都是超球體,而不是KD樹裏面的超矩形體。
在這裏插入圖片描述
我們看看具體的建樹流程:

1) 先構建一個超球體,這個超球體是可以包含所有樣本的最小球體。

2) 從球中選擇第一個點(離球的中心最遠的點),然後選擇第二個點(離第一個點最遠的點);將球中所有的點分配到離這兩個聚類中心最近的一個上,然後計算每個聚類的中心,以及聚類能夠包含它所有數據點所需的最小半徑。這樣我們得到了兩個子超球體,和KD樹裏面的左右子樹對應。

3)對於這兩個子超球體,遞歸執行步驟2). 最終得到了一個球樹。

可以看出KD樹和球樹類似,主要區別在於球樹得到的是節點樣本組成的最小超球體,而KD得到的是節點樣本組成的超矩形體,這個超球體要與對應的KD樹的超矩形體小,這樣在做最近鄰搜索的時候,可以避免一些無謂的搜索。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章