2016-04-24 13 views
0

Ich versuche, k-Mittelwert Clustering-Algorithmus für kleine Projekt zu implementieren. Ich kam auf this article, die darauf hindeuten, dassUpdate-Elemente mit numpy Array-Funktion

K-Means ist viel schneller, wenn Sie die Update-Funktionen unter Verwendung von Operationen auf numpy Arrays schreiben, anstatt manuell über den Arrays Looping und Aktualisierung der Werte selbst.

Ich verwende genau Iteration über jedes Element des Arrays, um es zu aktualisieren. Für jedes Element im Datensatz z weise ich das Cluster-Array vom nächsten Schwerpunkt durch Iteration durch jedes Element an.

for i in range(z): 
     clstr[i] = closest_center(data[i], cen) 

und meine Update-Funktion ist

def closest_center(x, clist): 
    dlist = [fabs(x - i) for i in clist] 
    return clist[dlist.index(min(dlist))] 

Da ich Graustufenbild verwende ich absoluten Wert bin mit dem euklidischen Abstand zu berechnen. Ich habe festgestellt, dass opencv auch diesen Algorithmus hat. Es dauert weniger als 2s, um den Algorithmus auszuführen, während meine mehr als 70s dauert. Darf ich wissen, was der Artikel vorschlägt?

Meine Bilder werden als Graustufen importiert und als 2d numpy Array dargestellt. Ich konvertierte weiter in 1D-Array, weil es einfacher ist, 1D-Array zu verarbeiten.

+0

Warum möchten Sie dies selbst implementieren? 'scipy' hat bereits einen k-means Clustering-Algorithmus für Sie. –

+0

@AkshatMahajan Als kleines Projekt in der Bildverarbeitung. Ich habe bereits über OpenCV Zugriff darauf. Trotzdem muss ich es ohne eingebaute Funktion verwenden. –

+0

sollten Sie mehr von Ihrem Code teilen, um eine bessere Idee zu haben. Auch sollten Sie nicht den euklidischen Abstand verwenden? – Romain

Antwort

1

Das Listenverständnis verlangsamt wahrscheinlich die Ausführung. Ich würde vorschlagen, die Funktion closest_center zu vektorisieren. Dies ist für 1-dimensionale Arrays einfach: