KD樹演算法

2021-08-21 07:10:05 字數 1463 閱讀 9836

學習了kd樹演算法,用來進行最近鄰匹配,其偽**如下:

# kd樹演算法的偽**

# 節點結構:

# node

# 建立kd樹:

# 輸入:點集list

# 輸出:kd樹根節點

def build_tree(list):

if list is none:

return none

# 計算所有點在每一維的方差並排序,從方差最大的維度vi維開始建樹

# 提取點集在vi維的中間點,該點為根節點tree_node

for point in other_points:

if point[vi] < tree_node[vi]:

else:

build_tree(left_points)

# 設定點集 left_points 根節點的父節點為 tree_node

build_tree(right_points)

# 設定點集 right_points 根節點的父節點為 tree_node

# 查詢最近鄰:

# 輸入:kd樹根節點kd, 目標點target

# 輸出:與 target 最近點 min_node, 最近距離 min_dis

def find_nn(kd, target):

if kd is none:

return 'kdtree is none'

while kd is not none: # 步驟1:二叉樹搜尋

min_node = kd

if target[s] < kd[s]:

kd = kd.left

else:

kd = kd.right

min_dis = distans(kd.data, target)

while kd is not none: # 步驟2:回溯

back_point = search_path.pop()

if distans(back_point[s], target[s]) < min_dis: # 如果圓與超平面相交,需要檢索另乙個子樹

if target[s] < back_point[s]: # 如果當前為左子樹,則檢索右子樹

kd = back_point.right

else: # 如果當前為右子樹,則檢索左子樹

kd = back_point.left

search_path.push(kd) # 節點壓入堆疊

if distans(kd.data, target) < min_dis: # 如果左子樹或右子樹存在距離更小的點,更新最近距離和最近點

min_dis = distans(kd.data, target)

min_node = kd

return min_node.data, min_dis

KNN演算法和KD樹

knn k nearestneighbor 鄰近演算法,或者說k最近鄰分類演算法 是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,...

演算法5 6 Kd樹

給定一系列的點,和乙個矩形。求矩形中包含的點的數量。這個問題可以通過建立矩陣來進行求解。首先將乙個空間分割成矩陣,將點放置在對應的格仔中,再計算矩形覆蓋的格仔,再判斷格仔中的點是否包含在矩形中 這種方法的問題是,可能這些點全都集中在乙個格仔中。這種情況下演算法的效率比較低。這種問題在地圖的應用中非常...

KNN演算法的KD樹C 實現

kd樹本質上是一種二叉樹,它擁有具備特定排列順序的 節點以便查詢資料,即在二叉排序樹之中,某個 節點左子樹的值均小於 節點的值,而右側均大於 節點的值,如果用中序遍歷這棵樹,它的列印順序將是從小到大遞增的順序。當然剩下的科普就不說了,這也是在pcl庫當中,最常用的輪子之一,處理點雲速度非常快。另外,...