我有许多点X
及其功能值f
存储在numpy
数组中。我想在X
中找到距离f
内没有更好点(较小r
值)的所有点。
X
是数十万点,因此我无法预先计算sp.spatial.distance.pdist(X)
,但请求以下内容:
def cluster(X,f,r):
pts,n = np.shape(X)
centers = []
for i in range(0,pts):
pdist = sp.spatial.distance.cdist(X,[X[i]])
if not np.any(np.logical_and(pdist <= r, f < f[i])):
centers.append(i)
return centers
这需要几分钟。有没有办法根据邻近度和另一个指标快速聚类?
答案 0 :(得分:2)
您可以对空间进行分区,以便可以忽略完全位于测试点半径之外的分区。
您也可以按f订购积分,因此您无需扫描价值较小的积分。
答案 1 :(得分:1)
我认为可以将其总结为:
使用k-nearest neighbor构建kdtree。使用半径查询树的查询点附近的点,检查它们的函数值。
x=scipy.random.rand(10000,2) # sample data
f = exp(-x[:,0]**2) # sample function values
K=scipy.spatial.KDTree(x) # generate kdtree of data set
ix = K.query_point_ball(x[0],0.1) # query indices of points within 0.1 of x[0] in euclidean norm
# check f[ix] for your function criterion
如果您对
感兴趣,可以一次查询所有积分ix = K.query_point_ball(x,0.04)
答案 2 :(得分:1)
您可以通过保留记录来显着减少距离计算的数量。例如,如果j是中心i的邻居并且它具有更大的f值,则j永远不能是中心,因为其邻居之一是具有较小f值的i。如果您需要澄清,请检查以下内容并告诉我。
result