Алгоритм спектральной бикластеризации

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии мы будем использовать алгоритм спектрального бикластеризации для кластеризации данных, одновременно учитывая строки (образцы) и столбцы (признаки) матрицы. Его цель - выявить паттерны не только между образцами, но и внутри подмножеств образцов, что позволяет обнаруживать локализованную структуру в данных. Это делает спектральное бикластеризацию особенно подходящей для наборов данных, где порядок или расположение признаков фиксировано, например, в изображениях, временных рядах или геномах. Мы будем использовать библиотеку scikit-learn для генерации датасета в виде шахматной доски и бикластеризации его с использованием алгоритма спектрального бикластеризации.

Советы по использованию ВМ

После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами при обучении, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/metrics("Metrics") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/cluster -.-> lab-49300{{"Алгоритм спектральной бикластеризации"}} sklearn/metrics -.-> lab-49300{{"Алгоритм спектральной бикластеризации"}} sklearn/datasets -.-> lab-49300{{"Алгоритм спектральной бикластеризации"}} ml/sklearn -.-> lab-49300{{"Алгоритм спектральной бикластеризации"}} end

Генерация выборочных данных

Мы генерируем выборочные данные с использованием функции 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()

Резюме

В этом практическом занятии мы научились использовать алгоритм спектральной бикластеризации для кластеризации данных, одновременно учитывая строки (образцы) и столбцы (признаки) матрицы. Мы сгенерировали датасет в виде шахматной доски и выполнили бикластеризацию его с использованием алгоритма спектральной бикластеризации. Мы также визуализировали результаты, чтобы показать связи между метками строк и столбцов, присвоенными моделью.