Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью 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()

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

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

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

Внешнее произведение векторов меток строк и столбцов показывает структуру шахматной доски, где разные сочетания меток строк и столбцов обозначены различными оттенками синего.
Общее время выполнения скрипта: (0 минут 0.516 секунды)
Связанные примеры
© 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