feature: add NSL lession 1

This commit is contained in:
2026-06-18 11:31:12 +02:00
parent c889e04ac6
commit 688f40feeb
7 changed files with 26574 additions and 0 deletions
Binary file not shown.
+21
View File
@@ -0,0 +1,21 @@
{ pkgs, lib, config, ... }:
{
languages.python = {
enable = true;
version = "3.14.4";
venv.enable = true;
venv.requirements = ''
ipython
jupyter
matplotlib
numpy
scikit-learn
'';
};
packages = [
pkgs.graphviz
pkgs.zsh
];
}
+132
View File
@@ -0,0 +1,132 @@
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, davies_bouldin_score
# =========================================================
# ?? EINSTELLUNGEN
# =========================================================
RANDOM_SEED = 42
MAX_K = 8
POINTS_PER_CLUSTER = 100
# echte Cluster (für Simulation)
CENTER_1 = [0, 0]
CENTER_2 = [6, 6]
CENTER_3 = [0, 6]
# =========================================================
# 1. DATEN GENERIEREN
# =========================================================
np.random.seed(RANDOM_SEED)
data1 = np.random.randn(POINTS_PER_CLUSTER, 2) + CENTER_1
data2 = np.random.randn(POINTS_PER_CLUSTER, 2) + CENTER_2
data3 = np.random.randn(POINTS_PER_CLUSTER, 2) + CENTER_3
X = np.vstack((data1, data2, data3))
# =========================================================
# 2. ELBOW + GÜTEMASSE
# =========================================================
k_values = range(1, MAX_K + 1)
inertia_values = []
silhouette_values = []
db_values = []
for k in k_values:
kmeans = KMeans(n_clusters=k, random_state=RANDOM_SEED, n_init=10)
kmeans.fit(X)
inertia_values.append(kmeans.inertia_)
if k >= 2:
labels = kmeans.labels_
silhouette_values.append(silhouette_score(X, labels))
db_values.append(davies_bouldin_score(X, labels))
else:
silhouette_values.append(np.nan)
db_values.append(np.nan)
# =========================================================
# 3. BESTES k (vereinfacht: nach Silhouette)
# =========================================================
best_k = k_values[np.nanargmax(silhouette_values)]
# Frage:
# Warum nehmen wir hier Silhouette und nicht Inertia?
# Lösung:
# ? Inertia sinkt immer ? kein klares Optimum
# =========================================================
# 4. FINALES MODELL
# =========================================================
kmeans_final = KMeans(n_clusters=best_k, random_state=RANDOM_SEED, n_init=10)
kmeans_final.fit(X)
labels_final = kmeans_final.labels_
centers_final = kmeans_final.cluster_centers_
# =========================================================
# 5. VISUALISIERUNG
# =========================================================
fig, ax = plt.subplots(1, 4, figsize=(20, 4))
# ---- Originaldaten ----
ax[0].scatter(X[:, 0], X[:, 1])
ax[0].set_title("Rohdaten (unclustered)")
# Frage:
# Siehst du hier schon Cluster?
# Lösung:
# ? Ja, visuell oft erkennbar, aber nicht immer eindeutig
# ---- Elbow ----
ax[1].plot(k_values, inertia_values, marker='o')
ax[1].set_title("Elbow (Inertia)")
ax[1].set_xlabel("k")
ax[1].set_ylabel("Fehler")
# ---- Silhouette ----
ax[2].plot(k_values, silhouette_values, marker='o')
ax[2].set_title("Silhouette Score")
ax[2].set_xlabel("k")
# ---- Finales Clustering ----
scatter = ax[3].scatter(X[:, 0], X[:, 1], c=labels_final)
ax[3].scatter(centers_final[:, 0], centers_final[:, 1],
c='red', s=200, marker='X')
ax[3].set_title(f"K-Means Ergebnis (k={best_k})")
# Frage:
# Warum sind die Cluster farbig getrennt?
# Lösung:
# ? Hard Clustering: jeder Punkt genau ein Label
plt.tight_layout()
plt.show()
# =========================================================
# ? WEITERE FRAGEN
# =========================================================
# Frage:
# Was passiert, wenn wir die Daten stärker überlappen lassen?
# Lösung:
# ? Clustering wird schwieriger, Scores schlechter
# Frage:
# Warum können verschiedene Runs unterschiedliche Ergebnisse liefern?
# Lösung:
# ? zufällige Initialisierung der Zentren
# Frage:
# Ist das gefundene k immer korrekt?
# Lösung:
# ? Nein, nur heuristisch bestimmt
File diff suppressed because one or more lines are too long
+183
View File
@@ -0,0 +1,183 @@
# Notizen NSL Lektion 1
> Thema: Unsupervised Learning
> Datum: 18.06.2026
> Dozentin: Matthias Dehmer
# Recap
## Supervised Learning
- Input: Arbeitet auf Daten (Feature Vektoren) mit Labels
- Output: Modell für Prediction
- Regression:
- Daten $X$ (Features) gegeben -> man will $Y$ (Zielgrösse) vorhersagen
- Gesucht ist eine Funktion $f$ mit $\hat{y} = f(x)$ für eine Vorhersage
- Klassifikation
- Binär
- Multiclass
- Applications
- Spam Filtering
- Image Classification
- Gesture Recognition
- Fraud Detection
## Unsupervised Learning
- Input: Arbeitet auf Daten (Feature Vektoren) ohne Labels
- Output: Model discovering underlying data structure of the data
- Methoden
- Clustering
- Dimension Reduction
- Association Rules
- Anwendungen
- Exploratory Data Analysis
- Outlier Detection
- Data Compression
- Denoising
## Reinforcement Learning
- Input: Current observed State from Environment and reward score
- Output: Agent chooses next action
- Methoden:
- Control
- Q-Learning
- Applications
- Games (Chess, Go)
## Recap: Supervised Learning
- Viele Machine Learning Probleme lassen sich in einfache Optimierungsprobleme überführen
- Fehlerquadratsumme (Methode der kleinsten Quadrate)
## Recap: Lineare Regression
- Problem: Wir wollen eine gute Approximation der Daten durch eine Gerade (Linearitätsforderung)
- Vorgehen: Gerade in die Punktwolke legen und Parameter solange anpassen bis Fehler (Epsilon) minimal sind
- Wobei Epsilon: $\epsilon_i = y_i - \hat{y}_i$
- Wir suchen eine Gerade, mit der Bedingung, dass die quadratische Summe aller Epsilon minimal wird
- $\min \sum_{i=1}^{n} \epsilon_i^2 = \min \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$
- Zur Analyse immer einen Scatterplot machen
- Dabei sieht man von Auge bereits ob eine Linearität vorhanden ist
# Unsupervised Learning
- Keine Labels
- Es gibt keine Outcome Variable
- Wie kann man sich das vorstellen
- Data is generated by some unknown process
- Unsupervised learning finds patterns in the data
- Methoden
- Clustering (k-Means, Hierarchical, DBSCAN)
- Density Estimation: Gaussian Mixture Models
- Dimensionality Reduction
- Neural Networks
- Autoencoder
- Generative Adversarial Models
- Restricted Boltzman Machines
# Clustering
- Clustering ist der Prozess der eine Gruppe in Untergruppen aufteilt
- Elemente in Untergruppen sind sich ähnlich
- Schwierig ist es ein Ähnlichkeitsmass (measure) zu finden
- Die Anzahl der Cluster hängt von der Anwendung ab
- intra-cluster measure -> tightness (Homogenität) of the cluster
- inter-cluster measure -> Daten sollen so gewählt werden, dass sie sich nicht überlappen
- Hauptproblem des Clusterings
- Wir haben einen Datensatz D den wir clustern wollen
- D enthält Altersangaben
- Wir schicken D durch einen Clusteringalgorithmus
- Wir erhalten C1-3
- C1: 20-30
- C2: 40-50
- C3: 60-80
- K-Means braucht eine Angabe wieviele Cluster zu erzeugen sind
- Wieviele Cluster sind denn aber sinnvoll?
- Zwei wesentliche Forderungen beim Clustern
1. Cluster sollen homogen sein (gleich verteilte Abstände innerhalb des Clusters)
2. Cluster sollen heterogen getrennt sein (nicht überlappen)
- Wir sehen: Die Anzahl der Cluster ist nicht eindeutig
- C1,C2: Schreibweise $|C| = 2$ "Die Grösse der Cluster C ist 2"
- Wie messen wir die Homogenität in folgendem Fall?
- c1 = {2,4,6}
- c2 = {2,15,80}
- Man könnte sich die Abstände zum Centroiden anschauen
- Hom(C1) > Hom(C2)
## Anwendung von Clustering
- Ähnlichkeit von Kunden, Krankheiten, Produkte
- Betrugserkennung
- Bspw. Intrusion Detection in Netzwerken
- Vergleich session duration zu transmitted bytes
- ssh -> lange Session Zeit aber nicht viel Daten
- web traffic -> kurze Session Zeit aber viele Daten
- Alle Verbindungen, die nicht in diese Cluster passen, sind "verdächtig"
# Dimensionsreduktion von Datensets
- Warum soll man Dimensionen reduzieren?
- Man fischt sich diejenigen Dimensionen heraus, welche für die gewünschte Information wichtig sind
- Alle ohne nützliche Information werden eliminiert (Projektion der gewünschten Dimension)
- Eine Art wie man Dimensionen reduzieren kann, ist PCA
- Principal Component Analysis
- Vereinfacht komplexe Datensets und behält dabei die wichtigsten Strukturen
- Wie funktioniert eine Dimensionsreduktion dim1000 zu dim2 mit PCA?
1. PC1: Man legt eine Achse in die Richtung wo die Varianz maximal ist
2. PC2: Richtung der maximalen *verbleibenden* Varianz, die orthogonal zu PC1 steht
- Bei einer (symmetrischen) Kovarianzmatrix sind die Eigenvektoren ohnehin paarweise orthogonal
- Allgemein: PC$_k$ = Eigenvektor zum $k$-grössten Eigenwert der Kovarianzmatrix
## Begriffe in der Dimensionsreduktion
- Varianz
- Streuung um den Mittelwert
- Population vs. Stichprobe (Bessel-Korrektur mit $n-1$):
$$
\sigma^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})^2
\qquad
s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar{x})^2
$$
- Kovarianz
- Mass für das *gemeinsame* Streuen zweier Variablen (steigen sie zusammen oder gegenläufig?)
- Hinweis: Kovarianz ist *nicht* die Steigung — die Regressionssteigung ist $\beta = \mathrm{Cov}(X,Y)/\mathrm{Var}(X)$
- Ist nicht begrenzt im Gegensatz zur Korrelation ($\rho = \mathrm{Cov}(X,Y)/(\sigma_X \sigma_Y) \in [-1, 1]$)
$$
\mathrm{Cov}(X,Y) = \frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})
$$
- Kovarianz-Matrix
- Für zentrierte Datenmatrix $X_c \in \mathbb{R}^{n \times d}$ (Mittelwert pro Spalte abgezogen):
$$
\Sigma = \frac{1}{n}\, X_c^{\top} X_c
\qquad
\Sigma_{jk} = \mathrm{Cov}(X_j, X_k)
$$
- $d \times d$, symmetrisch, positiv semidefinit
- Diagonale = Varianzen, off-diagonal = Kovarianzen
- Eigenwert-Problem (Lambda)
- Korrektur: die *Eigenwerte* $\lambda$ sind die Nullstellen des charakteristischen Polynoms (nicht die Eigenvektoren)
- $A\mathbf{v} = \lambda \mathbf{v} \iff (A - \lambda I)\mathbf{v} = \mathbf{0}$
- Nicht-triviale Lösung existiert nur, wenn:
$$
\det(A - \lambda I) = 0 \quad \text{(charakteristisches Polynom)}
$$
- Vorgehen: 1) $\lambda$ aus dem char. Polynom bestimmen, 2) je $\lambda$ den Eigenvektor $\mathbf{v}$ aus $(A - \lambda I)\mathbf{v} = \mathbf{0}$ lösen
- In der PCA: Eigenwert $\lambda_i$ = Varianz entlang PC$_i$; Gesamtvarianz $= \mathrm{tr}(\Sigma) = \sum_i \lambda_i$; erklärter Varianzanteil $= \lambda_i / \sum_j \lambda_j$
## PCA Vorgehen
1. Daten zentrieren (Mittelwert pro Feature abziehen); bei unterschiedlichen Skalen zusätzlich standardisieren (auf Einheitsvarianz)
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)
Binary file not shown.
File diff suppressed because one or more lines are too long