聚类计算的有效距离

时间:2017-05-05 11:35:23

标签: python performance numpy

我想计算从一组N个3D点到一组M个3D中心的距离,并将结果存储在NxM矩阵中(其中列i是从所有点到中心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))

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

我想知道是否有更好的方法(可能是一些多维广播或某些图书馆)。

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

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

1 个答案:

答案 0 :(得分:1)

一路广播:

scipy.spatial.KDTree

如果您只想要最近的中心,并且您有很多数据点(很多超过几十万个样本),您可能应该将数据存储在KD树中并使用中心进行查询({ {1}})。