2016-04-24 51 views
0

我正在尝试为小型项目实现k均值聚类算法。我来到this article这表明,使用numpy数组函数更新元素

K均值的速度要快得多,如果你写上使用numpy的阵列操作的更新功能,而不用手动循环数组过来,更新自己的值。

我正在使用数组的每个元素迭代来更新它。对于数据集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

为什么你想要自己实现这个? 'scipy'已经为你提供了k-means聚类算法。 –

+0

@AkshatMahajan作为一个图像处理的小项目。我已经可以通过OpenCV访问它。不过我必须不使用内置功能。 –

+0

你应该分享更多的代码,以便有更好的主意。你也不应该使用欧几里德距离吗? – Romain

回答

1

列表理解可能会减慢执行速度。我会建议矢量化功能closest_center。这对于一维阵列来说很简单:

import numpy as np 

def closest_center(x, clist): 
    return clist[np.argmin(np.abs(x - clist))]