29 · Unüberwachtes Lernen und Phänotypisierung von Patient:innen
pca_cluster.png
Abbildung · Quellcode

Erzeugt von fig_pca_cluster() in module/29-unueberwacht-phenotyping/code/figures.py, Zeile 87–125.
Python
Python-Code: in eine Datei mit Endung
.py schreiben und mit dem ▶-Knopf in VS Code ausführen – oder Zeile für Zeile in die Python-Konsole. Setzt die in Modul 02 eingerichtete Umgebung voraus.def fig_pca_cluster(X: np.ndarray, df) -> None: """2D PCA scatter coloured by k-Means cluster (k=3). Cluster names are assigned by ranking clusters on mean SOFA (illness severity) AFTER clustering, not by hardcoding cluster ID -> name. Raw k-Means cluster IDs (0, 1, 2, ...) are arbitrary and are not guaranteed to come out in severity order, so a fixed {0: "mild", 1: "moderate", ...} mapping would silently mislabel the plot whenever the ID order and the severity order disagree (as they do for this cohort/seed). """ km = KMeans(n_clusters=3, random_state=SEED, n_init=10) labels = km.fit_predict(X) pca = PCA(n_components=2, random_state=SEED) X_2d = pca.fit_transform(X) var = pca.explained_variance_ratio_ sofa_by_cluster = pd.Series(df["sofa_score"].values).groupby(labels).mean() severity_order = sofa_by_cluster.sort_values().index.tolist() severity_labels = ["leichter Verlauf", "mittelschwer", "Hochrisiko"] cluster_colors = {c: col for c, col in zip(severity_order, [PRIMARY, PALETTE[2], EVENT])} cluster_names = {c: f"Cluster {i + 1} ({severity_labels[i]})" for i, c in enumerate(severity_order)} cluster_markers = {c: m for c, m in zip(severity_order, ["o", "s", "^"])} fig, ax = plt.subplots(figsize=(7, 5)) for c in severity_order: mask = labels == c ax.scatter(X_2d[mask, 0], X_2d[mask, 1], color=cluster_colors[c], label=cluster_names[c], marker=cluster_markers[c], alpha=0.65, s=28, linewidths=0) ax.set_xlabel(f"Hauptkomponente 1 ({var[0]:.1%} Varianz erklärt)") ax.set_ylabel(f"Hauptkomponente 2 ({var[1]:.1%} Varianz erklärt)") ax.set_title("2D-PCA-Projektion eingefärbt nach k-Means-Cluster (k=3)") ax.legend(loc="best", markerscale=1.4) save(fig, ASSETS / "pca_cluster.png")