2017-05-05 64 views
1

我想计算从一组N个三维点到一组三维M中心的距离并将结果存储在一个NxM矩阵中(其中第i列是从所有点到中心的距离ⅰ)聚类计算的有效距离

实施例:

data = np.random.rand(100,3) # 100 toy 3D points 
centers = np.random.rand(20,3) # 20 toy 3D points 

为了计算所有点,我们可以使用一个单一的中心之间的距离“广播”,所以我们避免发生循环虽然所有点:

i = 0  # first center 
np.sqrt(np.sum(np.power(data - centers[i,:], 2),1)) # Euclidean distance 

现在,我们可以把这个代码在一个循环,遍历所有中心:

distances = np.zeros(data.shape[0], centers.shape[0]) 
for i in range(centers.shape[0]): 
    distances[:,i] = np.sqrt(np.sum(np.power(data - centers[i,:], 2),1)) 

然而,这显然是可以并行的和改进的操作。

我想知道是否有更好的方法做到这一点(也许一些多维广播或一些图书馆)。

这是一个非常常见的聚类和分类问题,你想从数据到一组类的距离,所以我认为这应该是一个有效的实现。

这样做的最好方法是什么?

+0

有关此主题的选项很多http://stackoverflow.com/questions/43367001/how-to-calculate-euclidean-distance-between-pair-of-rows-of-a-numpy-array/43368088#43368088 – NaN

+0

你知道吗scikit-learn:http://scikit-learn.org/?你会发现很多分类方法 – Dadep

+0

更具体,你可能想要使用paiwise距离函数(http://stackoverflow.com/a/43367358/5786475)或instanciate k-means方法(http:// scikit-learn.org/stable/modules/clustering.html#k-means)与您的中心并请求距离。 – pixelou

回答

1

广播一路:

import numpy as np 
data = np.random.rand(100,3) 
centers = np.random.rand(20,3) 
distances = np.sqrt(np.sum(np.power(data[:,None,:] - centers[None,:,:], 2), axis=-1)) 
print distances.shape 
# 100, 20 

如果你只是想最近的中心,你有很多的数据点(很多是比数100个样本以上),你应该存储你数据存储在KD树中,并用中心查询(scipy.spatial.KDTree)。