亲和传播聚类

Machine LearningMachine LearningBeginner
立即练习

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

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

简介

在本实验中,我们将学习如何使用亲和传播(Affinity Propagation)算法对数据集进行聚类。亲和传播算法是一种聚类算法,它不需要预先定义聚类的数量,并且能够根据输入数据自动确定聚类的数量。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”(Notebook)标签页,以访问 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/cluster("Clustering") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/cluster -.-> lab-49060{{"亲和传播聚类"}} sklearn/datasets -.-> lab-49060{{"亲和传播聚类"}} ml/sklearn -.-> lab-49060{{"亲和传播聚类"}} end

导入必要的库

我们将首先导入执行聚类和生成示例数据所需的库。

import numpy as np
from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

生成示例数据

我们将使用 sklearn.datasets 模块中的 make_blobs 函数生成一个示例数据集。make_blobs 函数在 n 维空间中生成一个点的数据集,每个点属于 k 个聚类之一。我们将在二维空间中生成一个包含 300 个点的数据集,有 3 个聚类,标准差为 0.5。

centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(
    n_samples=300, centers=centers, cluster_std=0.5, random_state=0
)

计算亲和传播

我们将使用 sklearn.cluster 模块中的 AffinityPropagation 类对数据集进行聚类。我们将把 preference 参数设置为 -50,该参数控制生成的聚类数量。preference 的值越低,生成的聚类就越多。然后,我们将打印一些指标来评估聚类的质量。

af = AffinityPropagation(preference=-50, random_state=0).fit(X)
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_

n_clusters_ = len(cluster_centers_indices)

print("Estimated number of clusters: %d" % n_clusters_)
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("Adjusted Rand Index: %0.3f" % metrics.adjusted_rand_score(labels_true, labels))
print(
    "Adjusted Mutual Information: %0.3f"
    % metrics.adjusted_mutual_info_score(labels_true, labels)
)
print(
    "Silhouette Coefficient: %0.3f"
    % metrics.silhouette_score(X, labels, metric="sqeuclidean")
)

绘制结果

我们将使用 matplotlib 库绘制聚类结果。我们将遍历每个聚类,并绘制属于该聚类的点,以及聚类中心和连接中心与聚类中每个点的线条。

plt.close("all")
plt.figure(1)
plt.clf()

colors = plt.cycler("color", plt.cm.viridis(np.linspace(0, 1, 4)))

for k, col in zip(range(n_clusters_), colors):
    class_members = labels == k
    cluster_center = X[cluster_centers_indices[k]]
    plt.scatter(
        X[class_members, 0], X[class_members, 1], color=col["color"], marker="."
    )
    plt.scatter(
        cluster_center[0], cluster_center[1], s=14, color=col["color"], marker="o"
    )
    for x in X[class_members]:
        plt.plot(
            [cluster_center[0], x[0]], [cluster_center[1], x[1]], color=col["color"]
        )

plt.title("Estimated number of clusters: %d" % n_clusters_)
plt.show()

总结

在这个实验中,我们学习了如何使用亲和传播算法对数据集进行聚类。我们生成了一个示例数据集,使用亲和传播算法进行聚类,并绘制了聚类结果。我们还使用各种指标评估了聚类的质量。