基于函数值和邻近度对聚类点进行聚类

时间:2016-09-14 13:14:31

标签: python numpy scipy cluster-analysis

我有许多点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

这需要几分钟。有没有办法根据邻近度和另一个指标快速聚类?

3 个答案:

答案 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