谱双聚类算法演示#

本示例演示了如何生成一个棋盘格数据集,并使用 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 秒)

相关示例

谱协同聚类算法演示

谱协同聚类算法演示

使用 KMeans 聚类的轮廓分析选择簇的数量

使用 KMeans 聚类的轮廓分析选择簇的数量

在玩具数据集上比较不同的聚类算法

在玩具数据集上比较不同的聚类算法

在玩具数据集上比较不同的分层链接方法

在玩具数据集上比较不同的分层链接方法

由 Sphinx-Gallery 生成的图库