Soweit ich weiß, wählt k-means die Anfangszentren zufällig aus. Da sie auf purem Glück basieren, können sie wirklich schlecht ausgewählt werden. Der K-means ++ Algorithmus versucht, dieses Problem zu lösen, indem er die Anfangszentren gleichmäßig verteilt.
Garantieren die beiden Algorithmen die gleichen Ergebnisse? Oder es ist möglich, dass die schlecht ausgewählten Anfangsschwerpunkte zu einem schlechten Ergebnis führen, egal wie viele Iterationen.
Nehmen wir an, es gibt einen bestimmten Datensatz und eine bestimmte Anzahl gewünschter Cluster. Wir führen einen k-means-Algorithmus aus, solange er konvergiert (keine Mittenbewegung mehr). Gibt es eine genaue Lösung für dieses Clusterproblem (bei gegebener SSE), oder führt k-means bei erneuter Ausführung zu manchmal unterschiedlichen Ergebnissen?
Wenn es mehr als eine Lösung für ein Clustering-Problem gibt (gegebener Datensatz, gegebene Anzahl von Clustern), garantiert K-means ++ ein besseres Ergebnis oder nur ein schnelleres? Mit besser meine ich niedrigere SSE.
Der Grund, warum ich diese Fragen stelle, ist, dass ich auf der Suche nach einem k-means-Algorithmus zum Clustering eines riesigen Datensatzes bin. Ich habe einige k-means ++ gefunden, aber es gibt auch einige CUDA-Implementierungen. Wie Sie bereits wissen, verwendet CUDA die GPU und kann mehr als Hunderte von Threads parallel ausführen. (So kann es den gesamten Prozess wirklich beschleunigen). Aber keine der CUDA-Implementierungen - die ich bisher gefunden habe - hat eine k-means ++ - Initialisierung.
k-means picks the initial centers randomly
. Das Auswählen von Anfangszentren ist nicht Teil des k-means-Algorithmus selbst. Die Zentren können beliebig gewählt werden. Eine gute Implementierung von k-means bietet verschiedene Optionen zum Definieren von Anfangszentren (zufällige, benutzerdefinierte, k-äußerste Punkte usw.)Antworten:
K-means beginnt mit der zufälligen Zuweisung von Cluster-Zentren und sucht dann nach "besseren" Lösungen. K-means ++ beginnt mit der zufälligen Zuordnung eines Clusterzentrums und sucht dann nach anderen Zentren, wenn das erste gegeben ist. So beide Algorithmen zufällige Initialisierung als Ausgangspunkt zu verwenden, so können unterschiedliche Ergebnisse auf verschiedenen Läufen geben. Als Beispiel können Sie diese Vorlesung überprüfen: Clustering als Beispiel für ein Inferenzproblem. In der 40. Minute gibt es Beispiele für k-means-Läufe, aber die gesamte Vorlesung ist interessant.
Beantworten Sie also Ihre Fragen:
Was Ihr Problem betrifft: Was k-means ++ tut, wählt die Zentren aus und startet dann ein "klassisches" k-means. Sie können also (1) den Teil des Algorithmus verwenden, der Zentren auswählt, und dann (2) diese Zentren in den GPU-Implementierungen von k-means verwenden. Auf diese Weise wird zumindest ein Teil eines Problems mit GPU-basierter Software gelöst und sollte daher schneller sein.
quelle
Anzeigen der Startschwerpunkte von K-means und K-means ++
Um eine intuitive Ansicht des Unterschieds zwischen den Startschwerpunkten der beiden Algorithmen hinzuzufügen, betrachten Sie den folgenden Spielzeugdatensatz, der aus drei einheitlich erzeugten Quadraten besteht
Hier sind 2D-Histogramme, die zeigen, wo die Algorithmen k-means und k-means ++ ihre Startschwerpunkte initialisieren (2000 Simulationen).
Es ist klar, dass das Standard-k-Mittel die Punkte gleichmäßig initialisiert, während k-Mittel ++ dazu neigt, nahe der Mitte der Quadrate zu initialisieren
quelle
Viele Male KMeans Die zufällige Initialisierung benötigt weniger Zeit als KMeans ++, führt jedoch zu einem schlechten Ergebnis. Aufgrund der zufälligen Initialisierung erhalten wir oft ein lokales Optimum, da unser anfänglicher Satz von Zentren nicht über den Datensatz verteilt ist.
Beantworten Sie also Ihre Frage:
quelle