Spectral Biclustering-Algorithmus

Beginner

This tutorial is from open-source community. Access the source code

Einführung

In diesem Lab verwenden wir den Spectral Biclustering-Algorithmus, um Daten zu gruppieren, indem wir gleichzeitig sowohl die Zeilen (Stichproben) als auch die Spalten (Eigenschaften) einer Matrix berücksichtigen. Ziel ist es, Muster nicht nur zwischen Stichproben, sondern auch innerhalb von Teilmengen von Stichproben zu identifizieren, was die Detektion von lokalisiertem Struktur innerhalb der Daten ermöglicht. Dies macht das spectral biclustering besonders gut geeignet für Datensätze, bei denen die Reihenfolge oder Anordnung der Eigenschaften festgelegt ist, wie in Bildern, Zeitreihen oder Genomen. Wir werden die scikit-learn-Bibliothek verwenden, um einen Schachbrett-Datensatz zu generieren und ihn mit dem Spectral Biclustering-Algorithmus zu gruppieren.

Tipps für die VM

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie prompt beheben.

Beispiel-Daten generieren

Wir generieren die Beispiel-Daten mit der Funktion make_checkerboard. Jeder Pixel innerhalb von shape=(300, 300) repräsentiert mit seiner Farbe einen Wert aus einer gleichmäßigen Verteilung. Der Rauschen wird aus einer normalen Verteilung hinzugefügt, wobei der für noise gewählte Wert die Standardabweichung ist.

from sklearn.datasets import make_checkerboard
from matplotlib import pyplot as plt

n_clusters = (4, 3)
data, rows, columns = make_checkerboard(
    shape=(300, 300), n_clusters=n_clusters, noise=10, shuffle=False, random_state=42
)

plt.matshow(data, cmap=plt.cm.Blues)
plt.title("Original dataset")
_ = plt.show()

Mischen der Daten

Wir mischen die Daten, und das Ziel ist es, sie anschließend mit SpectralBiclustering wiederherzustellen.

import numpy as np

## Erstellen von Listen mit gemischten Zeilen- und Spaltenindizes
rng = np.random.RandomState(0)
row_idx_shuffled = rng.permutation(data.shape[0])
col_idx_shuffled = rng.permutation(data.shape[1])

## Neudefinieren der gemischten Daten und Darstellung
data = data[row_idx_shuffled][:, col_idx_shuffled]

plt.matshow(data, cmap=plt.cm.Blues)
plt.title("Gemischter Datensatz")
_ = plt.show()

Anpassen von SpectralBiclustering

Wir passen das Modell an und vergleichen die erhaltenen Cluster mit der wahren Klasse. Beachten Sie, dass wir bei der Erstellung des Modells die gleiche Anzahl von Clustern angeben, die wir verwendet haben, um den Datensatz zu erstellen (n_clusters = (4, 3)), was dazu beiträgt, ein gutes Ergebnis zu erzielen.

from sklearn.cluster import SpectralBiclustering
from sklearn.metrics import consensus_score

model = SpectralBiclustering(n_clusters=n_clusters, method="log", random_state=0)
model.fit(data)

## Berechnen der Ähnlichkeit zweier Mengen von Biclustern
score = consensus_score(
    model.biclusters_, (rows[:, row_idx_shuffled], columns[:, col_idx_shuffled])
)
print(f"Konsenswert: {score:.1f}")

Darstellung der Ergebnisse

Jetzt ordnen wir die Daten basierend auf den Zeilen- und Spaltenbezeichnungen, die vom SpectralBiclustering-Modell zugewiesen wurden, in aufsteigender Reihenfolge neu an und plotten sie erneut. Die row_labels_ reichen von 0 bis 3, während die column_labels_ von 0 bis 2 reichen, was insgesamt 4 Cluster pro Zeile und 3 Cluster pro Spalte repräsentiert.

## Zuerst die Zeilen und dann die Spalten neu ordnen.
reordered_rows = data[np.argsort(model.row_labels_)]
reordered_data = reordered_rows[:, np.argsort(model.column_labels_)]

plt.matshow(reordered_data, cmap=plt.cm.Blues)
plt.title("Nach der Biclustering; neu angeordnet, um die Bicluster zu zeigen")
_ = plt.show()

Als letztes möchten wir die Beziehungen zwischen den Zeilen- und Spaltenbezeichnungen, die vom Modell zugewiesen wurden, demonstrieren. Daher erstellen wir ein Gitter mit numpy.outer, das die sortierten row_labels_ und column_labels_ nimmt und 1 zu jedem hinzuaddiert, um sicherzustellen, dass die Bezeichnungen bei 1 anfangen statt bei 0 für eine bessere Visualisierung.

plt.matshow(
    np.outer(np.sort(model.row_labels_) + 1, np.sort(model.column_labels_) + 1),
    cmap=plt.cm.Blues,
)
plt.title("Schachbrett-Struktur der neu angeordneten Daten")
plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man den Spectral Biclustering-Algorithmus verwendet, um Daten zu gruppieren, indem man gleichzeitig sowohl die Zeilen (Stichproben) als auch die Spalten (Eigenschaften) einer Matrix berücksichtigt. Wir haben einen Schachbrett-Datensatz erzeugt und ihn mit dem Spectral Biclustering-Algorithmus in Bicluster gegliedert. Wir haben auch die Ergebnisse visualisiert, um die Beziehungen zwischen den Zeilen- und Spaltenbezeichnungen, die vom Modell zugewiesen wurden, zu demonstrieren.