层次聚类算法在数字数据集上的应用

本例的目的是直观展示不同层次聚类算法的度量行为,而不是为了找到数字数据集的最佳聚类。因此,示例在二维嵌入上进行。

这个例子向展示了层次聚类的“富者愈富”现象,即倾向于创建大小不均的聚类。对于平均链接策略,这种行为尤为明显,最终会形成几个包含少量数据点的聚类。

单链接策略的情况更为极端,最终会形成一个非常大的聚类,覆盖了大多数数字,一个中等大小的聚类包含大多数零数字,而其他聚类则由围绕边缘的噪声点组成。

其他链接策略则导致更均匀分布的聚类,因此可能对数据集的随机重采样不太敏感。

计算嵌入

完成。

ward: 0.05s average: 0.06s complete: 0.07s single: 0.02s

以下是使用Python进行层次聚类的示例代码。

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) # ---------------------------------------------------------------------- # 可视化聚类 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嵌入 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(f"{linkage}:\t{time() - t0:.2f}s") plot_clustering(X_red, clustering.labels_, f"{linkage} linkage") plt.show()

脚本的总运行时间:(0分钟 1.625秒)

相关示例

  • 在玩具数据集上比较不同的层次链接方法
  • 在有和没有结构的情况下进行层次聚类
  • 在手写数字上进行流形学习:局部线性嵌入,Isomap...
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485