學習了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庫當中,最常用的輪子之一,處理點雲速度非常快。另外,...