我正在尝试为小项目实现k-mean聚类算法。我遇到了this article,这表明
如果使用numpy数组上的操作编写更新函数,而不是手动循环遍历数组并自行更新值,K-Means会快得多。
我正在使用迭代遍历数组的每个元素来更新它。对于数据集z
中的每个元素,我通过迭代通过每个元素从最近的质心分配集群数组。
for i in range(z):
clstr[i] = closest_center(data[i], cen)
我的更新功能是
def closest_center(x, clist):
dlist = [fabs(x - i) for i in clist]
return clist[dlist.index(min(dlist))]
由于我使用的是灰度图像,因此我使用绝对值来计算欧几里德距离。
我注意到opencv
也有这个算法。执行算法需要不到2秒,而我的执行时间超过70秒。我可以知道这篇文章的内容吗?
我的图像以灰度导入,并表示为2d numpy数组。我进一步转换为1d数组,因为它更容易处理1d数组。
答案 0 :(得分:1)
列表理解可能会减慢执行速度。我建议 vectorize 函数closest_center
。这对于一维数组来说非常简单:
import numpy as np
def closest_center(x, clist):
return clist[np.argmin(np.abs(x - clist))]