快速计算整个数据集到每个聚类中心的距离

1 投票
1 回答
5074 浏览
提问于 2025-04-18 04:47

在一个数据聚类的问题中,我有两个numpy数组,X和C。X代表观测数据,而C代表可以用X中的数据形成的聚类中心。它们的列数(特征)是一样的,但C的行数通常比X少很多。我想找一种快速的方法来计算X中每个观测值与C中所有中心之间的最小平方距离。用简单的Python代码可以这样写:

D2 = np.array([min([np.inner(c-x,c-x) for c in C]) for x in X])

但是这个方法比较慢,所以我尝试改进速度,使用了:

D2 = np.array([min(np.sum((C-x)**2, axis=1)) for x in X])

不过我对执行时间还不太满意,因为里面还是有一个for循环,我觉得还有进一步优化的空间。有没有人知道怎么能进一步减少执行时间呢?

顺便说一下,我用这个方法是为了通过K-Means++算法生成K-Means的种子。

1 个回答

3

在使用numpy和scipy这两个库时,最快的方法是用一个专门的函数,叫做 scipy.spatial.distance.cdist,这个函数就是为了这个目的而设计的。

scipy.spatial.distance.cdist(XA, XB, metric='euclidean', p=2, ...)

这个函数可以计算两个输入集合中每一对数据之间的距离。

另外,值得一提的是,scipy还提供了k均值聚类的功能。

scipy.cluster.vq.kmeans

撰写回答