Data Science · Klinik Klinische Datenanalyse & Machine Learning
Ansicht
Lerntiefe
Codeansicht
Farbschema

29 · Unüberwachtes Lernen und Phänotypisierung von Patient:innen

pca_cluster.png

Abbildung · Quellcode

pca_cluster

Erzeugt von fig_pca_cluster() in module/29-unueberwacht-phenotyping/code/figures.py, Zeile 87–125.

Python
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")

← zurück zu Modul 29 · vollständige Datei ansehen