使用kd樹資料結構,實現k means聚類加速

2021-10-22 13:54:00 字數 1551 閱讀 9500

主要的方法就是,將資料儲存在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 這個式子可以分為以下幾...