在数据聚类问题中,我有两个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])
这是相当慢的,所以我通过doin来提高速度
D2 = np.array([min(np.sum((C-x)**2, axis=1)) for x in X])
相反,但我还不满意执行时间,因为for循环仍然存在,我相信有希望。有没有人知道如何进一步减少这个的执行时间?
对于好奇的人,我使用它通过K-Means ++算法为K-Means生成种子。
答案 0 :(得分:2)
使用numpy / scipy堆栈获得的最快速度是专门用于此目的的scipy.spatial.distance.cdist
。
scipy.spatial.distance.cdist(XA, XB, metric='euclidean', p=2, ...)
计算两组输入的每对之间的距离。
同样值得注意的是,scipy也提供了kmeans聚类。