2016-04-24 39 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))]