2.5 k-Means
Der Algorithmus
📄 03_dimred.pdf, Folie 44k-Means (auch Vektorquantisierung, vector quantization) teilt Datenpunkte in Cluster ein. Jeder Cluster wird durch sein Zentrum (mean, Mittelwert) repräsentiert.
- Initialisierung: Gegeben sind die Datenpunkte , . Setze Clusterzentren auf Zufallswerte .
- Zuweisungsschritt (assignment): Weise jeden Datenpunkt dem nächstliegenden Clusterzentrum zu:
mit der Indikatorvariable , falls , sonst . 3. Anpassungsschritt (update): Berechne eine neue Position für jedes Clusterzentrum aus den ihm zugewiesenen Datenpunkten:
- Wiederhole Zuweisungs- und Anpassungsschritt, bis sich die Zuweisungen nicht mehr ändern.
Lesehilfe für die Formeln:
- ist eine -Tabelle aus Nullen und Einsen. In jeder Spalte (jedem Punkt) steht genau eine 1, beim zugehörigen Cluster. Das ist die harte Zuweisung.
- zählt die Punkte in Cluster .
- summiert genau die Punkte in Cluster .
- Der Quotient ist also schlicht der Mittelwert der Punkte im Cluster, daher der Name k-Means.
- Das Quadrat in ändert nichts am (die Wurzel ist monoton), spart aber die Wurzelberechnung.
Ergänzung: Bekommt ein Zentrum im Zuweisungsschritt keinen einzigen Punkt, ist und das Update teilt durch null. Übliche Abhilfen: das Zentrum neu zufällig setzen (z.B. auf einen zufälligen Datenpunkt) oder es an seiner alten Position lassen. Deshalb initialisiert man die Zentren in der Praxis meist auf zufällig gewählte Datenpunkte statt auf beliebige Zufallswerte.
Durchgerechnetes Beispiel
Ergänzung, nicht auf den Folien. Eindimensionale Daten , , ungünstige Initialisierung , .
Iteration 1.
| Punkt | Abstand zu | Abstand zu | Cluster |
|---|---|---|---|
| 1 | 0 | 1 | 1 |
| 2 | 1 | 0 | 2 |
| 3 | 2 | 1 | 2 |
| 8, 9, 10 | 7, 8, 9 | 6, 7, 8 | 2 |
Update: , .
Iteration 2.
| Punkt | Abstand zu | Abstand zu | Cluster |
|---|---|---|---|
| 1 | 0 | 5.4 | 1 |
| 2 | 1 | 4.4 | 1 (gewechselt) |
| 3 | 2 | 3.4 | 1 (gewechselt) |
| 8, 9, 10 | 7, 8, 9 | 1.6, 2.6, 3.6 | 2 |
Update: , .
Iteration 3. Zuweisung mit , : zu Cluster 1, zu Cluster 2. Nichts ändert sich, fertig.
Die Summe der quadrierten Abstände zum eigenen Zentrum (siehe unten, ) sinkt dabei von Iteration zu Iteration:
| nach Update in Iteration | Zentren | |
|---|---|---|
| 1 | ||
| 2 |
📄 03_dimred.pdf, Folie 45 zeigt dasselbe Wechselspiel in 2D mit 40 Punkten und : Assignment, Update, Assignment, … Die zwei Läufe (Run 1, Run 2) mit verschiedenen Startwerten enden in verschiedenen Lösungen.
Was wird bei k-Means optimiert?
📄 03_dimred.pdf, Folie 46k-Means partitioniert die Datenpunkte so, dass die summierte Varianz innerhalb jedes Clusters minimiert wird:
Der Bruch ist die (erwartungstreu geschätzte) Varianz der Punkte in Cluster , summiert über alle Cluster.
Ergänzung zur üblichen Form der Zielfunktion: In der Literatur (z.B. Bishop) wird meist die Summe der quadrierten Abstände ohne Division durch die Clustergröße angegeben,
(within-cluster sum of squares, die y-Achse der Grafik auf der Folie heißt genau so). Genau ist es, was der Algorithmus schrittweise verkleinert. Beide Kriterien messen „wie kompakt sind die Cluster“, gewichten große Cluster aber unterschiedlich.
Warum konvergiert k-Means?
Ergänzung, Begründung für „konvergiert beweisbar immer“ von 📄 03_dimred.pdf, Folie 43:
- Zuweisungsschritt (Zentren fest): Jeder Punkt wechselt zum nächsten Zentrum. Sein Beitrag zu kann dadurch nur kleiner werden oder gleich bleiben.
- Anpassungsschritt (Zuweisung fest): Für einen festen Cluster wird durch den Mittelwert minimiert. Ableitung nach null setzen: . Das ist genau die Update-Formel. Auch dieser Schritt kann also nicht vergrößern.
- ist nach unten durch 0 beschränkt, und es gibt nur endlich viele Zuordnungen von Punkten zu Clustern (höchstens ). Da nie steigt, kann keine Zuordnung zweimal mit echt verschiedenem auftreten, der Algorithmus kommt also nach endlich vielen Schritten zum Stillstand.
Das ist ein Spezialfall eines Wechselverfahrens (alternating optimization): Man optimiert abwechselnd nach einem Teil der Variablen, während der andere festgehalten wird. (Ergänzung: Der EM-Algorithmus für Gaußsche Mischmodelle funktioniert nach demselben Muster, mit weichen statt harten Zuweisungen.)
Lokale Minima
Leider kann der Algorithmus in lokalen Minima hängen bleiben. Ein Auffinden des globalen Minimums ist nicht garantiert, das globale Problem ist NP-hart.
Ergänzung, ein kleines Beispiel: Vier Punkte an den Ecken eines flachen Rechtecks, , , , , und .
- Gute Lösung: linke Seite , rechte Seite , Zentren und , .
- Start mit , : Die unteren beiden Punkte liegen näher an , die oberen näher an . Die Updates ergeben wieder und . Der Algorithmus ist sofort fertig, mit .
Die zweite Lösung ist ein stabiler Fixpunkt, aber 16-mal schlechter. Abhilfe in der Praxis: k-Means mehrmals mit verschiedenen Zufallsstarts laufen lassen und das Ergebnis mit dem kleinsten nehmen (scikit-learn macht das mit n_init). Bessere Startwerte liefert z.B. k-means++ (Zentren werden weit auseinander gewählt).
Wahl der Anzahl der Cluster
Das Kriterium lässt sich dazu verwenden, die Anzahl der Cluster festzulegen (Ellenbogen-Methode, elbow method):
- Algorithmus für unterschiedliche durchlaufen lassen.
- Summierte Varianz innerhalb jedes Clusters gegen auftragen.
- nach dem letzten großen Abfall auswählen.
In der Grafik der Folie fällt die Kurve von bis stark und danach kaum noch. Also wählt man .
Man darf nicht einfach das mit der kleinsten Varianz nehmen. Die Varianz innerhalb der Cluster sinkt mit wachsendem immer weiter, bei (jeder Punkt sein eigener Cluster) ist sie 0. Gesucht ist der Punkt, ab dem zusätzliche Cluster kaum noch etwas bringen.
Problematische Fälle
📄 03_dimred.pdf, Folie 47Die Folie (aus MacKay) zeigt zwei typische Fehlschläge:
- Oben: Cluster unterschiedlicher Größe/Streuung. Ein großer, breit gestreuter Cluster links und ein kleiner, dichter rechts. k-Means mit teilt den großen Cluster und schlägt einige seiner Randpunkte dem kleinen Cluster zu. Grund: k-Means zieht die Grenze genau in der Mitte zwischen den Zentren (Mittelsenkrechte), unabhängig davon, wie weit die Cluster streuen.
- Unten: langgestreckte Cluster. Zwei parallele, senkrecht langgezogene Cluster. k-Means schneidet sie quer durch, weil es implizit runde (isotrope) Cluster annimmt: Die Distanz ist in allen Richtungen gleich gewichtet.
Ergänzung: Die Clustergrenzen von k-Means sind immer linear (die Zellen sind die Voronoi-Zellen der Zentren). Abhilfe bei länglichen Clustern: Daten vorher geeignet skalieren, oder ein Gaußsches Mischmodell verwenden, das pro Cluster eine eigene Kovarianzmatrix lernt.
Reale Daten: Iris-Datensatz
📄 03_dimred.pdf, Folie 48Der Iris-Datensatz (150 Blüten, 3 Arten, 4 Merkmale) links mit k-Means () geclustert, rechts mit den wahren Arten eingefärbt. Iris setosa wird sauber als eigener Cluster gefunden. Versicolor und virginica überlappen, und k-Means zieht die Grenze zwischen ihnen anders als die tatsächliche Artgrenze. Die Clusterung ist also nur teilweise mit den echten Klassen deckungsgleich. Das ist bei unüberwachten Verfahren normal: k-Means kennt die Arten nicht und optimiert nur Kompaktheit.
Probleme von k-Means
📄 03_dimred.pdf, Folie 49Ad-hoc-Festlegungen (auf der Folie „Ad-hoc-Merkmale“):
- Die Anzahl der Cluster wird von vornherein festgelegt.
- Wie soll man sich entscheiden, wenn mehrere Clusterungen möglich sind (vgl. 📄 03_dimred.pdf, Folie 40)?
- Ist der Mittelwert wirklich ein guter Repräsentant für einen Cluster? (Er ist z.B. empfindlich gegenüber Ausreißern und muss selbst kein sinnvoller Datenpunkt sein.)
- Gibt es bessere Distanzfunktionen als die euklidische?
Algorithmische Probleme:
- Nur die Distanz zählt, die Größe des Clusters wird nicht berücksichtigt (siehe oben, kleiner dichter Cluster „stiehlt“ Punkte).
- Keine Repräsentation der Form eines Clusters (nur ein Zentrum, keine Kovarianz).
- Harte Zuweisung: Jeder Datenpunkt trägt nur zu einem Cluster bei, und jeder Punkt hat innerhalb seines Clusters das gleiche Gewicht. Ein Punkt genau auf der Grenze zählt voll für eine Seite.
Ergänzung: Fast alle diese Punkte adressiert das Gaußsche Mischmodell (Gaussian Mixture Model, mit EM-Algorithmus trainiert): eigene Kovarianzmatrix pro Cluster (Form), Mischungsgewichte (Größe) und weiche Zuweisungen (Wahrscheinlichkeiten statt 0/1). k-Means ist der Grenzfall eines solchen Modells mit gleichen, isotropen Kovarianzen und harten Zuweisungen.
In scikit-learn
Ergänzung.
import numpy as np
from sklearn.cluster import KMeans
X = np.array([[1], [2], [3], [8], [9], [10]], float)
km = KMeans(n_clusters=2, n_init=10, random_state=0).fit(X)
print(km.cluster_centers_.ravel()) # [2. 9.] (Reihenfolge kann variieren)
print(km.labels_) # Clusterindex pro Punkt
print(km.inertia_) # J = 4.0, Grundlage für die Ellenbogen-Methode