本例的目的是直观展示不同层次聚类算法的度量行为,而不是为了找到数字数据集的最佳聚类。因此,示例在二维嵌入上进行。
这个例子向展示了层次聚类的“富者愈富”现象,即倾向于创建大小不均的聚类。对于平均链接策略,这种行为尤为明显,最终会形成几个包含少量数据点的聚类。
单链接策略的情况更为极端,最终会形成一个非常大的聚类,覆盖了大多数数字,一个中等大小的聚类包含大多数零数字,而其他聚类则由围绕边缘的噪声点组成。
其他链接策略则导致更均匀分布的聚类,因此可能对数据集的随机重采样不太敏感。
完成。
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秒)