This repository has been archived on 2026-06-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
cas-pml/NSL/aufgaben/README.md
T
2026-06-18 14:53:56 +02:00

67 lines
2.7 KiB
Markdown

# K-Means: Elbow-Methode & Gütemasse
> Thema: Optimale Clusterzahl $k$ bestimmen und Clusterqualität bewerten
> Skript: Unsupervised Learning (CAS PML)
## Ziel
Auf synthetischen 2D-Daten (drei Gauss-Blobs) K-Means für verschiedene $k$ laufen lassen und die "richtige" Clusterzahl systematisch über Gütemasse bestimmen — statt nur visuell zu schätzen.
## Projektstruktur
```
.
├── data/ # leer: Daten werden synthetisch generiert
├── src/
│ └── k_means2_elbow_measures.py
├── devenv.nix
└── README.md
```
Ausführen (in der devenv-Shell):
```
python src/k_means2_elbow_measures.py
```
## Ablauf des Skripts
1. Daten generieren: je 100 Punkte um die Zentren $(0,0)$, $(6,6)$, $(0,6)$ via `np.random.randn` (Seed fix → reproduzierbar)
2. Für $k = 1 \dots 8$ K-Means fitten und drei Masse sammeln:
- Inertia (`kmeans.inertia_`) — immer
- Silhouette-Score und Davies-Bouldin-Index — erst ab $k \geq 2$ (für $k=1$ nicht definiert → `np.nan`)
3. Bestes $k$ wählen (vereinfacht: maximaler Silhouette-Score via `np.nanargmax`)
4. Finales Modell mit `best_k` fitten → Labels + Zentren
5. Visualisierung in vier Panels: Rohdaten | Elbow (Inertia) | Silhouette | finales Clustering
## Gütemasse (Kurzreferenz)
- Inertia / WCSS — Summe der quadrierten Abstände zum jeweiligen Zentroid; sinkt monoton mit $k$, hat also kein Optimum, nur einen "Knick" (Elbow)
$$ \text{WCSS} = \sum_{i=1}^{k} \sum_{x \in P_i} \lVert x - \mu_i \rVert^2 $$
- Silhouette-Score — $a_i$ = mittlere Intra-Cluster-Distanz, $b_i$ = mittlere Distanz zum nächsten Cluster; Bereich $[-1, 1]$, höher = besser
$$ s_i = \frac{b_i - a_i}{\max(a_i, b_i)} $$
- Davies-Bouldin-Index — mittleres "Worst-Case"-Verhältnis von Cluster-Streuung zu Cluster-Abstand; niedriger = besser (Achtung: umgekehrt zur Silhouette!)
$$ DB = \frac{1}{k} \sum_{i=1}^{k} \max_{j \neq i} \frac{\sigma_i + \sigma_j}{d(c_i, c_j)} $$
- mit $\sigma_i$ = mittlere Distanz der Punkte in Cluster $i$ zu ihrem Zentroid $c_i$
## Verständnisfragen (im Code eingebettet)
- [ ] Warum nimmt man zur $k$-Wahl die Silhouette und nicht die Inertia?
- [ ] Warum sind die Cluster im Ergebnis-Plot farblich klar getrennt?
- [ ] Warum können verschiedene Runs unterschiedliche Ergebnisse liefern?
- [ ] Ist das gefundene $k$ immer "korrekt"?
## Experimente (zum Ausprobieren)
- [ ] Zentren näher zusammenlegen (Daten stärker überlappen) → wie verändern sich Elbow und Scores?
- [ ] Davies-Bouldin gegen die Silhouette als $k$-Kriterium tauschen → wählt es dasselbe $k$?
- [ ] `n_init` reduzieren / Seed variieren → wie stabil ist das Ergebnis?
> Zu allen Verständnisfragen stehen im Skript kurze Musterantworten als Kommentar.