不同层次聚类方法的可视化

本示例旨在直观展示不同层次聚类链接选项的行为,而非寻找数字数据集的最佳聚类。因此,示例在二维嵌入上进行操作。通过这个示例,可以观察到层次聚类中“富者愈富”的现象,即倾向于创建大小不均的聚类。这种趋势在平均链接策略中尤为明显,最终会形成几个包含少量数据点的聚类。

单链接策略的情况更为极端,大部分数字被一个非常大的聚类覆盖,一个中等大小(清晰的)聚类包含大多数零数字,而其他聚类则从边缘的噪声点中抽取。其他链接策略则导致更均匀分布的聚类,因此可能对数据集的随机重采样不太敏感。

在进行聚类之前,首先需要计算数字数据集的二维嵌入。这个过程已经完成。接下来,将展示使用不同链接策略的层次聚类结果。

代码实现

以下是使用Python和scikit-learn库实现上述聚类和可视化的代码。

from sklearn import datasets, manifold from sklearn.cluster import AgglomerativeClustering import numpy as np import matplotlib.pyplot as plt import time # 加载数字数据集 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]) # 计算数字数据集的二维嵌入 print("Computing embedding") X_red = manifold.SpectralEmbedding(n_components=2).fit_transform(X) print("Done.") # 应用不同的层次聚类链接策略 for linkage in ("ward", "average", "complete", "single"): clustering = AgglomerativeClustering(linkage=linkage, n_clusters=10) t0 = time.time() clustering.fit(X_red) print(f"{linkage}:\t{time.time() - t0:.2f}s") plot_clustering(X_red, clustering.labels_, f"{linkage} linkage") plt.show()

上述代码首先加载了数字数据集,然后定义了一个函数来可视化聚类结果。接着,使用不同的链接策略(ward、average、complete、single)来执行层次聚类,并计算每种策略的执行时间。最后,展示了每种链接策略的聚类结果。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485