Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.

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

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

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

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Создание примера данных

Мы создаем пример данных с помощью функции make_checkerboard. Цвет каждого пикселя в shape=(300, 300) соответствует значению из равномерного распределения. Шум добавляется из нормального распределения, причем значение, выбранное для noise, является стандартным отклонением.

Как видно, данные распределены по 12 ячейкам кластеров и довольно хорошо различимы.

from matplotlib import pyplot as plt

from sklearn.datasets import make_checkerboard

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

Мы перемешиваем данные, а затем пытаемся восстановить их с помощью 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])

Мы переопределяем перемешанные данные и строим их график. Видно, что структура исходной матрицы данных утрачена.

data = data[row_idx_shuffled][:, col_idx_shuffled]

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

Обучение 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)

# 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}")
consensus score: 1.0

Оценка принимает значения от 0 до 1, где 1 соответствует идеальному совпадению. Она показывает качество бикластеризации.

Визуализация результатов

Теперь мы переставляем данные в порядке возрастания меток строк и столбцов, присвоенных моделью SpectralBiclustering, и снова строим график. Значения row_labels_ лежат в диапазоне от 0 до 3, а значения column_labels_ — от 0 до 2, что соответствует 4 кластерам в каждой строке и 3 кластерам в каждом столбце.

# 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()
After biclustering; rearranged to show biclusters

В заключение мы хотим показать взаимосвязь между метками строк и столбцов, присвоенными моделью. Для этого мы создаем сетку с помощью 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("Checkerboard structure of rearranged data")
plt.show()
Checkerboard structure of rearranged data

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

Общее время выполнения скрипта: (0 минут 0.516 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_spectral_biclustering.ipynb

Download Python source code: plot_spectral_biclustering.py

Download zipped: plot_spectral_biclustering.zip

Связанные примеры

Демонстрация алгоритма спектральной совместной кластеризации

Выбор количества кластеров с помощью анализа силуэта при кластеризации KMeans

Сравнение различных алгоритмов кластеризации на искусственных наборах данных

Сравнение различных методов иерархического связывания на искусственных наборах данных

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/bicluster/plot_spectral_biclustering.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API