Algoritmo de Biclustering Espectral

Beginner

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

Introducción

En este laboratorio, usaremos el algoritmo de biclustering espectral para agrupar datos considerando simultáneamente las filas (muestras) y columnas (características) de una matriz. Su objetivo es identificar patrones no solo entre las muestras sino también dentro de subconjuntos de muestras, lo que permite la detección de estructura localizada dentro de los datos. Esto hace que el biclustering espectral sea particularmente adecuado para conjuntos de datos donde el orden o la disposición de las características es fija, como en imágenes, series temporales o genomas. Usaremos la biblioteca scikit-learn para generar un conjunto de datos de tablero de ajedrez y aplicar el algoritmo de biclustering espectral para agruparlo.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Generar datos de muestra

Generamos los datos de muestra usando la función make_checkerboard. Cada píxel dentro de shape=(300, 300) representa con su color un valor de una distribución uniforme. El ruido se agrega a partir de una distribución normal, donde el valor elegido para noise es la desviación estándar.

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()

Mezclar los datos

Mezclamos los datos y el objetivo es reconstruirlos después usando SpectralBiclustering.

import numpy as np

## Creating lists of shuffled row and column indices
rng = np.random.RandomState(0)
row_idx_shuffled = rng.permutation(data.shape[0])
col_idx_shuffled = rng.permutation(data.shape[1])

## Redefining the shuffled data and plot it.
data = data[row_idx_shuffled][:, col_idx_shuffled]

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

Ajustar SpectralBiclustering

Ajustamos el modelo y comparamos los clusters obtenidos con la verdad básica. Tenga en cuenta que al crear el modelo especificamos la misma cantidad de clusters que usamos para crear el conjunto de datos (n_clusters = (4, 3)), lo que contribuirá a obtener un buen resultado.

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)

## Compute the similarity of two sets of biclusters
score = consensus_score(
    model.biclusters_, (rows[:, row_idx_shuffled], columns[:, col_idx_shuffled])
)
print(f"consensus score: {score:.1f}")

Graficando los resultados

Ahora, reordenamos los datos según las etiquetas de fila y columna asignadas por el modelo SpectralBiclustering en orden ascendente y graficamos de nuevo. Las row_labels_ van desde 0 hasta 3, mientras que las column_labels_ van desde 0 hasta 2, lo que representa un total de 4 clusters por fila y 3 clusters por columna.

## Reordering first the rows and then the columns.
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("After biclustering; rearranged to show biclusters")
_ = plt.show()

Como última etapa, queremos demostrar las relaciones entre las etiquetas de fila y columna asignadas por el modelo. Por lo tanto, creamos una cuadrícula con numpy.outer, que toma las row_labels_ y column_labels_ ordenadas y les suma 1 a cada una para asegurar que las etiquetas empiecen desde 1 en lugar de 0 para una mejor visualización.

plt.matshow(
    np.outer(np.sort(model.row_labels_) + 1, np.sort(model.column_labels_) + 1),
    cmap=plt.cm.Blues,
)
plt.title("Checkerboard structure of rearranged data")
plt.show()

Resumen

En este laboratorio, aprendimos cómo usar el algoritmo de Biclustering Espectral para agrupar datos al considerar simultáneamente tanto las filas (muestras) como las columnas (características) de una matriz. Generamos un conjunto de datos de tablero de ajedrez y lo agrupamos en biclusters usando el algoritmo de Biclustering Espectral. También visualizamos los resultados para demostrar las relaciones entre las etiquetas de fila y columna asignadas por el modelo.