主要的方法就是,將資料儲存在kd樹這種空間資料結構中,樹的思想類似於二叉搜尋樹、紅黑樹等,真的很強大(相信童靴們明白的)。建立kd樹的過程,就是在多維資料點中,按照某一維度數值大小的中位數(中間值)不斷迴圈劃分空間,也就是超平面劃分空間,形成樹的層次結構。在傳統的knn演算法中,有很多的應用和說明。
如下函式簡單說明了,kd樹的生成步驟
def
create
(point_list=
none
, dimensions=
none
, axis=
0, sel_axis=
none):
""" 基於一系列n維空間的資料點,建立kd樹 """
ifnot point_list and
not dimensions:
raise valueerror(
'empty error'
)elif point_list:
dimensions = check_dimensionality(point_list, dimensions)
# by default cycle through the axis
sel_axis = sel_axis or
(lambda prev_axis:
(prev_axis+1)
% dimensions)
ifnot point_list:
return kdnode(sel_axis=sel_axis, axis=axis, dimensions=dimensions)
# sort point list and choose median as pivot element
point_list =
list
(point_list)
point_list.sort(key=
lambda point: point[axis]
) median =
len(point_list)//2
loc = point_list[median]
left = create(point_list[
:median]
, dimensions, sel_axis(axis)
) right = create(point_list[median +1:
], dimensions, sel_axis(axis)
)return kdnode(loc, left, right, axis=axis, sel_axis=sel_axis, dimensions=dimensions)
改進的k-means方法主要考慮了合理的初始候選質心的方式,並且利用kd樹的特性,減少了迴圈計算歐式距離的次數,並且從voronoi多邊形得到的啟發進行最近點計算和剪枝策略,實現的**。執行證明在大量資料的情況下,演算法的執行效率確實有很大改進。最後感謝tapas kanungo等的**《an efficient k-means clustering algorithm:analysis and implementation》提供的演算法思路和證明。 資料結構 樹專題 K D樹
3.資料測試 如果我們作為中 華 有 為的hr,想要給那些年齡在20到35歲且年薪要求在10k 20k的技術人員傳送面試邀請 這類問題就叫做二維範圍查詢two dimensional range query。如果只有一維的情況,我們可以通過遞迴遍歷預先構造的二叉查詢樹來解決。但是對於二維或者更高維的...
KD樹 BBF KNN使用C 實現(2)
在上一節中我們講解了kd的構造過程,這裡我們主要講解的kd的搜尋過程,如何查詢距離目標點最近的點。我們先把kd樹的最鄰近搜尋 knn 的 貼上出來 private node kdtreefindnearest node tree,train target else searchnode search...
資料結構 樹的實現
在做樹的遍歷的時候發現自己對實現樹的方法不太了解,也就是不知道怎麼把一棵樹的結構存到記憶體中,所以對樹的實現找了一些資料,自己也研究了一下。首先,要想讓計算機正確的儲存你的 樹 你要用一種和你 相匹配的輸入方式,我用的是採用廣義表表示的輸入法,例如 a b d,e c f,g 這個式子可以分為以下幾...