From 12c271281a97a8db04817b035eab6ba95516fd11 Mon Sep 17 00:00:00 2001 From: aaron Date: Thu, 18 Jun 2026 14:32:05 +0200 Subject: [PATCH] feature: update l1 notes --- NSL/notizen/L1_Notizen.md | 162 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) diff --git a/NSL/notizen/L1_Notizen.md b/NSL/notizen/L1_Notizen.md index 582eb3f..a04d182 100644 --- a/NSL/notizen/L1_Notizen.md +++ b/NSL/notizen/L1_Notizen.md @@ -165,3 +165,165 @@ $$ \Sigma = \frac{1}{n}\, X_c^{\top} X_c \qquad \Sigma_{jk} = \mathrm{Cov}(X_j, 2. Kovarianzmatrix $\Sigma$ berechnen 3. Eigenwert-Problem lösen -> Eigenwerte $\lambda_i$ und zugehörige Eigenvektoren $\mathbf{v}_i$ 4. Endkoordinatensystem bestimmen: Eigenvektoren nach Eigenwerten absteigend sortieren, die Top-$k$ als neue Achsen wählen und die Daten darauf projizieren ($Z = X_c W$, mit $W$ = Matrix der Top-$k$ Eigenvektoren) + +# Clustering Data + +- Beispielsweise Segmentierung von Kunden + - Soll möglichst automatisch Cluster von Kundenprofilen erstellen +- Challenge beim Clustern: Kann ein semantischer Wert zu Gruppen hinzugefügt werden? + - Bspw. Diese Gruppe Männer zwischen 30 und 40 Jahren interessiert sich für Fussball + +## Types of Clustering + +- Hard Clustering + - ein Element gehört genau zu einem cluster + - Mengenpartitionierung + - Methoden: k-Means, k-Mediods +- Soft Clustering + - Ein Element kann zu einem oder mehreren Clustern gehören + - Methode: Gaussian Mixture Models (EM Algorithm) + +## Ähnlichkeitsmasse (Distanzmasse) + +- Distanzmetrik $D(u, v)$ zwischen zwei Punkten $u$ und $v$ +- Euklidische Distanz (L2-Norm): einfache geometrische Distanz + +$$ \lVert u - v \rVert_2 = \sqrt{\sum_{k=1}^{d} (u_k - v_k)^2} $$ + +- Manhattan-Distanz (L1-Norm): komponentenweise summiert, "man kann nicht schräg laufen" + +$$ \lVert u - v \rVert_1 = \sum_{k=1}^{d} |u_k - v_k| $$ + +- Kosinus-Ähnlichkeit: normiertes Skalarprodukt, misst den Winkel zwischen den Feature-Vektoren + +$$ \cos\varphi = \frac{u^{\top} v}{\lVert u \rVert_2 \, \lVert v \rVert_2} $$ + +- Minkowski-Distanz: verallgemeinert L1/L2 über den Parameter $p$ ($p=1$ Manhattan, $p=2$ Euklid, $p=\infty$ Chebyshev) + +$$ D(u, v) = \left( \sum_{i=1}^{d} |u_i - v_i|^p \right)^{1/p} $$ + +- Merke: kleine Distanz = hohe Ähnlichkeit; Distanz $0$ = maximale Ähnlichkeit + +# Clustering with K-Means + +- Beliebtester Clustering-Algorithmus +- Verwendet die euklidische Distanz +- Annahme: Anzahl Cluster $k$ ist im Voraus bekannt (Nachteil) +- Zwei Phasen + 1. Training: Partitionieren der Datenmenge in $k$ Untermengen über das Distanzmass + 2. Inference (optional): nachdem die Zentroiden bestimmt sind, neue Datenpunkte dem nächsten Zentrum zuordnen + +## Zielfunktion (Objective) + +- Ziel: Daten in $k$ Gruppen ähnlicher Varianz aufteilen und dabei die Within-Cluster Sum of Squares (WCSS, auch *Inertia*) minimieren +- Gegeben $n$ $d$-dimensionale Punkte $x_1, \dots, x_n$; partitioniere in disjunkte Mengen $P_1, \dots, P_k$: + +$$ \sum_{i=1}^{k} \sum_{x \in P_i} \| x - \mu_i \|^2 \;\to\; \min \quad \text{mit} \quad \bigcup_{i} P_i = \{x_1, \dots, x_n\}, \; P_i \cap P_j = \emptyset \;\; \forall i \neq j $$ + +- Das ist äquivalent zur Minimierung der Varianz: + +$$ \sum_{i=1}^{k} \sum_{x \in P_i} \| x - \mu_i \|^2 = \sum_{i=1}^{k} |P_i| \, \mathrm{Var}(P_i) $$ + +## Ablauf (Lloyd's Algorithm) + +1. Initiale Positionen für $k$ Zentroiden setzen (gute Startwerte → schnellere Konvergenz) +2. Zuordnung (*Centers to Clusters*): Voronoi-Tessellation der Datendomäne, jeden Punkt seinem nächsten Zentroiden zuordnen +3. Update (*Clusters to Centers*): Zentroiden als Mittelwert (Schwerpunkt) aller Punkte im Cluster neu berechnen +4. Schritte 2–3 wiederholen, bis Konvergenz (keine Änderung der Zuordnung mehr) + +- Konvergenz: ein Punkt wechselt das Cluster, wenn er einem anderen Zentrum näher ist; das Update reduziert die Intra-Cluster-Varianz + +## Nachteile & Annahmen von k-Means + +- NP-hart → k-Means ist heuristisch und kann in einem lokalen statt globalen Optimum landen +- Sensitiv gegenüber Ausreissern (wegen der L2-Distanz) +- Setzt konvexe, isotrope (etwa gleich grosse, runde) Cluster voraus +- $k$ muss vorab bekannt sein +- Inertia ist nicht normiert (skalenabhängig) +- Sensitiv gegenüber der Initialisierung + - zufällig in der Datendomäne, oder + - $k$ zufällig gewählte Datenpunkte, oder + - k-means++: Startzentren möglichst weit auseinander wählen +- Leere Cluster möglich (Zentroid zu weit weg, zieht keine Punkte an) → Workaround: mehrfach mit verschiedenen Startpunkten laufen lassen + +## Anzahl Cluster $k$ bestimmen & Qualität messen + +- WCSS sinkt monoton mit steigendem $k$ (wird $0$ bei $k = n$) → allein kein Gütemass, da nicht normiert +- Elbow-Methode: WCSS bzw. erklärte Varianz über $k$ plotten und den "Knick" (elbow) wählen + - Erklärte Varianz = Anteil der Between-Cluster-Varianz an der Gesamtvarianz (ideal: 100 %) +- Silhouette-Score: bewertet die Zuordnung pro Punkt über die mittlere Intra-Cluster-Distanz $a_i$ und die mittlere Distanz zum nächsten Cluster $b_i$ + - Bereich: $1$ = ideal, $0$ = überlappende Cluster, $-1$ = vermutlich falsch zugeordnet + - Gesamt-Score = Mittelwert der $s_i$ über alle Punkte + +$$ s_i = \frac{b_i - a_i}{\max(a_i, b_i)} $$ + +- (Hartigan-Regel ist im Skript, gilt aber als veraltet → hier weggelassen) + +# Clustering with k-Medoids/PAM + +- K-Means funktioniert schlecht mit kategorialen Daten und ist anfällig für Ausreisser (L2-Distanz) +- Informell: "K-Medoids verhält sich zu K-Means wie der Median zum Durchschnitt" +- Idee: den Zentroid (Mittelwert) durch einen **Medoid** ersetzen + - Medoid = der am zentralsten gelegene *tatsächliche* Datenpunkt eines Clusters + - Der Medoid kommt also real im Datensatz vor (anders als der berechnete Mittelwert) + - Benötigt ein Distanzmass $D$ +- PAM = Partition Around Medoids (konkreter k-Medoids-Algorithmus) + +## Medoid (Definition) + +- Der Medoid minimiert die Summe der Distanzen zu allen anderen Punkten des Clusters: + +$$ \mathbf{x}_m = \arg\min_{\mathbf{y} \in \{x_1, \dots, x_n\}} \sum_{i=1}^{n} D(\mathbf{x}_i, \mathbf{y}) $$ + +## PAM Algorithmus + +1. $k$ Punkte als initiale Medoiden wählen +2. jeden Datenpunkt dem Cluster mit dem nächsten Medoid zuordnen +3. zufällig einen Nicht-Medoid $i$ wählen; $m$ sei der Medoid, dem $i$ aktuell zugeordnet ist +4. Gesamtkosten $J$ eines Tauschs von Medoid $m$ mit $i$ berechnen +5. falls $J < 0$: tauschen ($i$ wird neuer Medoid) +6. zurück zu Schritt 2, bis Konvergenz + +# Categorial Values for k-Means/k-Medoids + +- Kategoriale Werte tauchen oft in Datasets auf + - Geschlecht, Farben, Binär (True/False) + - K-Means funktioniert hier nicht direkt +- Problem: meist keine Ordnung und keine sinnvolle Arithmetik auf den Werten – auch nicht bei Integer-Codierung + - Rot→0, Grün→1, Blau→2, Gelb→3 + - Was wäre dann ein Zentroid bei 1.32? Und ist Distanz(Grün, Gelb) $= 2$ wirklich grösser als Distanz(Rot, Grün) $= 1$? + +## Workarounds to support Categorial Values + +- One-Hot Encoding + - jede Kategorie wird zu einer eigenen 0/1-Spalte + - bläst den Raum auf: aus 1 Farb-Spalte (4 Werte) werden 4 Dimensionen + - Fluch der Dimensionalität: in hohen Dimensionen sind alle Punkte ungefähr gleich weit entfernt + - Distanz Zentrum→Ecke eines Hyperwürfels (Seitenlänge $2r$) wächst mit $r\sqrt{d}$ + - Empfehlung: zuerst Dimensionsreduktion (z.B. PCA), dann im Unterraum clustern + +# Clustering with k-Modes / k-Prototypes + +- k-Modes: ersetzt den Mittelwert durch den **Modus** (häufigster Wert) und nutzt ein Unähnlichkeitsmass statt der euklidischen Distanz +- k-Prototypes: kombiniert k-Modes (kategorial) mit k-Means (numerisch) → für gemischte Attribute +- Unähnlichkeitsmass für zwei Objekte $a, b$ mit $m$ kategorialen Attributen (zählt die Mismatches): + +$$ D(\mathbf{a}, \mathbf{b}) = \sum_{i=1}^{m} \delta(a_i, b_i), \qquad \delta(a_i, b_i) = \begin{cases} 1 & a_i \neq b_i \\ 0 & a_i = b_i \end{cases} $$ + +- Modus $\mathbf{q} = (q_1, \dots, q_m)^{\top}$: minimiert die Summe der Unähnlichkeiten zu allen Objekten + +$$ D(X, \mathbf{q}) = \sum_{i=1}^{n} D(\mathbf{x}_i, \mathbf{q}) $$ + +- $\mathbf{q}$ muss nicht in $X$ liegen und ist nicht zwingend eindeutig; gefunden über die Häufigkeit der Kategorien je Attribut + +## kmodes Package (für Übung 2) + +- scikit-learn enthält *kein* k-Modes/k-Prototypes → separates Paket `kmodes` + +```python +from kmodes.kprototypes import KPrototypes + +kproto = KPrototypes(n_clusters=4, init='Cao', verbose=2) +clusters = kproto.fit_predict(X, categorical=[1, 2]) # Indizes der kategorialen Spalten +kproto.cluster_centroids_ # bestimmte Cluster-Zentren +```