Введение
В этом лабораторном занятии мы будем использовать алгоритм спектрального бикластеризации для кластеризации данных, одновременно учитывая строки (образцы) и столбцы (признаки) матрицы. Его цель - выявить паттерны не только между образцами, но и внутри подмножеств образцов, что позволяет обнаруживать локализованную структуру в данных. Это делает спектральное бикластеризацию особенно подходящей для наборов данных, где порядок или расположение признаков фиксировано, например, в изображениях, временных рядах или геномах. Мы будем использовать библиотеку scikit-learn для генерации датасета в виде шахматной доски и бикластеризации его с использованием алгоритма спектрального бикластеризации.
Советы по использованию ВМ
После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами при обучении, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Генерация выборочных данных
Мы генерируем выборочные данные с использованием функции make_checkerboard. Каждый пиксель в shape=(300, 300) представляет собой значение из равномерного распределения с помощью своего цвета. Шум добавляется из нормального распределения, где значение, выбранное для noise, является стандартным отклонением.
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()
Перемешивание данных
Мы перемешиваем данные, и цель - потом реконструировать их с использованием SpectralBiclustering.
import numpy as np
## Создание списков перемешанных индексов строк и столбцов
rng = np.random.RandomState(0)
row_idx_shuffled = rng.permutation(data.shape[0])
col_idx_shuffled = rng.permutation(data.shape[1])
## Переопределение перемешанных данных и их отображение.
data = data[row_idx_shuffled][:, col_idx_shuffled]
plt.matshow(data, cmap=plt.cm.Blues)
plt.title("Shuffled dataset")
_ = plt.show()
Применение SpectralBiclustering
Мы обучаем модель и сравниваем полученные кластеры с истинными значениями. Обратите внимание, что при создании модели мы указываем такое же количество кластеров, которое мы использовали для создания датасета (n_clusters = (4, 3)), что способствует получению хорошего результата.
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)
## Вычисление сходства двух наборов бикластеров
score = consensus_score(
model.biclusters_, (rows[:, row_idx_shuffled], columns[:, col_idx_shuffled])
)
print(f"consensus score: {score:.1f}")
Построение графиков результатов
Теперь мы переупорядочиваем данные в соответствии с метками строк и столбцов, присвоенными моделью SpectralBiclustering, в порядке возрастания и снова строим график. row_labels_ имеет значения от 0 до 3, а column_labels_ - от 0 до 2, что означает в сумме 4 кластера в каждой строке и 3 кластера в каждом столбце.
## Переупорядочиваем сначала строки, а затем столбцы.
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("После бикластеризации; переупорядочено для отображения бикластеров")
_ = plt.show()
В качестве последнего шага мы хотим показать связи между метками строк и столбцов, присвоенными моделью. Поэтому мы создаем сетку с использованием numpy.outer, которая берет отсортированные row_labels_ и column_labels_ и прибавляет 1 к каждому, чтобы метки начинались с 1 вместо 0 для лучшей визуализации.
plt.matshow(
np.outer(np.sort(model.row_labels_) + 1, np.sort(model.column_labels_) + 1),
cmap=plt.cm.Blues,
)
plt.title("Шахматная структура переупорядоченных данных")
plt.show()
Резюме
В этом практическом занятии мы научились использовать алгоритм спектральной бикластеризации для кластеризации данных, одновременно учитывая строки (образцы) и столбцы (признаки) матрицы. Мы сгенерировали датасет в виде шахматной доски и выполнили бикластеризацию его с использованием алгоритма спектральной бикластеризации. Мы также визуализировали результаты, чтобы показать связи между метками строк и столбцов, присвоенными моделью.