带连接性约束的层次聚类

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验展示了如何使用 Python 中的 Scikit-learn 库执行具有连接性约束的层次聚类。在层次聚类中,簇是通过根据簇之间的距离递归合并或分裂来形成的。连接性约束可用于根据数据点之间的连接性来限制簇的形成,这可以产生更有意义的簇。

虚拟机提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neighbors("Nearest Neighbors") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/neighbors -.-> lab-49331{{"带连接性约束的层次聚类"}} sklearn/cluster -.-> lab-49331{{"带连接性约束的层次聚类"}} sklearn/datasets -.-> lab-49331{{"带连接性约束的层次聚类"}} ml/sklearn -.-> lab-49331{{"带连接性约束的层次聚类"}} end

生成数据

我们首先使用 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 库绘制了无结构和结构化层次聚类。