注意
跳转至页面底部 下载完整示例代码,或通过 JupyterLite 或 Binder 在浏览器中运行此示例。
在数字的二维嵌入上进行各种凝聚层次聚类#
本示例展示了在数字数据集的二维嵌入上,凝聚层次聚类中各种链接(linkage)选项的表现。
本示例旨在直观地展示这些度量标准(metrics)的行为,而非为了寻找数字的最优聚类方案。这就是为什么本示例基于二维嵌入进行操作的原因。
本示例向我们展示了凝聚层次聚类的“富者愈富”(rich getting richer)特性,即该算法往往倾向于产生大小不均的聚类。
这种行为在“平均链接”(average linkage)策略中尤为明显,该策略最终会产生几个仅包含少量数据点的聚类。
“单链接”(single linkage)的情况则更为病态:会出现一个覆盖大部分数字的超大聚类,一个包含大多数“0”数字的中等大小(且较为纯净)的聚类,而所有其他聚类则由边缘周围的噪声点组成。
其他的链接策略能产生分布更均匀的聚类,因此对数据集的随机重采样(resampling)往往不那么敏感。
Computing embedding
Done.
ward : 0.06s
average : 0.06s
complete : 0.05s
single : 0.02s
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
from time import time
import numpy as np
from matplotlib import pyplot as plt
from sklearn import datasets, manifold
digits = datasets.load_digits()
X, y = digits.data, digits.target
n_samples, n_features = X.shape
np.random.seed(0)
# ----------------------------------------------------------------------
# Visualize the clustering
def plot_clustering(X_red, labels, title=None):
x_min, x_max = np.min(X_red, axis=0), np.max(X_red, axis=0)
X_red = (X_red - x_min) / (x_max - x_min)
plt.figure(figsize=(6, 4))
for digit in digits.target_names:
plt.scatter(
*X_red[y == digit].T,
marker=f"${digit}$",
s=50,
c=plt.cm.nipy_spectral(labels[y == digit] / 10),
alpha=0.5,
)
plt.xticks([])
plt.yticks([])
if title is not None:
plt.title(title, size=17)
plt.axis("off")
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
# ----------------------------------------------------------------------
# 2D embedding of the digits dataset
print("Computing embedding")
X_red = manifold.SpectralEmbedding(n_components=2).fit_transform(X)
print("Done.")
from sklearn.cluster import AgglomerativeClustering
for linkage in ("ward", "average", "complete", "single"):
clustering = AgglomerativeClustering(linkage=linkage, n_clusters=10)
t0 = time()
clustering.fit(X_red)
print("%s :\t%.2fs" % (linkage, time() - t0))
plot_clustering(X_red, clustering.labels_, "%s linkage" % linkage)
plt.show()
脚本总运行时间:(0 分钟 1.396 秒)
相关示例



