Probieren Sie diese k-means Variante:
Initialisierung :
- Wählen Sie
k
Zentren aus dem Datensatz nach dem Zufallsprinzip oder noch besser mithilfe der Strategie kmeans ++
- Berechnen Sie für jeden Punkt die Entfernung zum nächstgelegenen Cluster-Zentrum und bauen Sie dafür einen Heap auf
- Zeichnen Sie Punkte aus dem Heap und weisen Sie sie dem nächsten Cluster zu, es sei denn, der Cluster ist bereits überfüllt. Wenn ja, berechnen Sie das nächstgelegene Cluster-Center und fügen Sie es erneut in den Heap ein
Am Ende sollten Sie eine Partitionierung haben, die Ihren Anforderungen von + -1 der gleichen Anzahl von Objekten pro Cluster entspricht. (Stellen Sie sicher, dass die letzten Cluster auch die richtige Anzahl haben. Die ersten m
Cluster sollten ceil
Objekte haben, der Rest genau floor
Objekte.)
Iterationsschritt :
Voraussetzungen: Eine Liste für jeden Cluster mit "Tauschvorschlägen" (Objekte, die sich lieber in einem anderen Cluster befinden würden).
Schritt E : Berechnen Sie die aktualisierten Cluster-Zentren wie in regulären k-Mitteln
M- Schritt: Durchlaufen aller Punkte (entweder nur einer oder alle in einem Stapel)
Berechnen Sie das nächstgelegene Clusterzentrum für Objekte / alle Clusterzentren, die näher an den aktuellen Clustern liegen. Wenn es sich um einen anderen Cluster handelt:
- Wenn der andere Cluster kleiner als der aktuelle Cluster ist, verschieben Sie ihn einfach in den neuen Cluster
- Wenn es einen Tauschvorschlag des anderen Clusters (oder eines Clusters mit einer geringeren Entfernung) gibt, tauschen Sie die beiden Elementclusterzuweisungen aus (wenn es mehr als ein Angebot gibt, wählen Sie das mit der größten Verbesserung aus).
- Andernfalls geben Sie einen Tauschvorschlag für den anderen Cluster an
Die Clustergrößen bleiben unveränderlich (+ - der Decken- / Bodendifferenz), ein Objekt wird nur von einem Cluster zu einem anderen verschoben, solange dies zu einer Verbesserung der Schätzung führt. Es sollte daher irgendwann konvergieren wie k-means. Es könnte allerdings etwas langsamer sein (dh mehr Iterationen).
Ich weiß nicht, ob dies bereits veröffentlicht oder implementiert wurde. Es ist genau das, was ich versuchen würde (wenn ich k-means versuchen würde. Es gibt viel bessere Clustering-Algorithmen.)
Ein guter Ausgangspunkt könnte die Implementierung von k-means in ELKI sein , die anscheinend bereits drei verschiedene Initialisierungen unterstützt (einschließlich k-means ++), und die Autoren sagten, dass sie auch unterschiedliche Iterationsstrategien haben möchten, um alle verschiedenen allgemeinen abzudecken modulare Varianten (z. B. Lloyd, MacQueen, ...).