简介
本实验展示了如何使用 Python 中的 Scikit-learn 库执行具有连接性约束的层次聚类。在层次聚类中,簇是通过根据簇之间的距离递归合并或分裂来形成的。连接性约束可用于根据数据点之间的连接性来限制簇的形成,这可以产生更有意义的簇。
虚拟机提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
生成数据
我们首先使用 Scikit-learn 中的 make_swiss_roll 函数生成瑞士卷数据集。瑞士卷数据集是一个呈螺旋形状的三维数据集。
from sklearn.datasets import make_swiss_roll
n_samples = 1500
noise = 0.05
X, _ = make_swiss_roll(n_samples, noise=noise)
## 使其更薄
X[:, 1] *= 0.5
无结构层次聚类
我们执行凝聚聚类(AgglomerativeClustering),它属于无任何连接性约束的层次聚类。
from sklearn.cluster import AgglomerativeClustering
ward = AgglomerativeClustering(n_clusters=6, linkage="ward").fit(X)
label = ward.labels_
绘制无结构层次聚类
我们使用 matplotlib 库绘制无结构层次聚类。
import matplotlib.pyplot as plt
fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
ax1.scatter(
X[label == l, 0],
X[label == l, 1],
X[label == l, 2],
color=plt.cm.jet(float(l) / np.max(label + 1)),
s=20,
edgecolor="k",
)
结构化层次聚类
我们使用 Scikit-learn 中的 kneighbors_graph 函数定义具有 10 个邻居的 k 近邻。
from sklearn.neighbors import kneighbors_graph
connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)
我们再次执行具有连接性约束的凝聚聚类。
ward = AgglomerativeClustering(
n_clusters=6, connectivity=connectivity, linkage="ward"
).fit(X)
label = ward.labels_
绘制结构化层次聚类
我们使用 matplotlib 库来绘制结构化层次聚类。
fig2 = plt.figure()
ax2 = fig2.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
ax2.scatter(
X[label == l, 0],
X[label == l, 1],
X[label == l, 2],
color=plt.cm.jet(float(l) / np.max(label + 1)),
s=20,
edgecolor="k",
)
总结
本实验展示了如何使用 Python 中的 Scikit-learn 库执行具有连接性约束的层次聚类。我们首先生成了瑞士卷数据集并执行了无结构层次聚类。然后我们定义了具有 10 个邻居的 k 近邻并执行了结构化层次聚类。最后,我们使用 matplotlib 库绘制了无结构和结构化层次聚类。