二分 K 均值与常规 K 均值性能比较

Machine LearningMachine LearningBeginner
立即练习

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

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

简介

这是一篇逐步指导教程,用于比较常规 K 均值算法和二分 K 均值算法的性能。本教程将展示这些算法在聚类时随着聚类数(n_clusters)增加而产生的差异。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 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-49071{{"二分 K 均值与常规 K 均值性能比较"}} sklearn/datasets -.-> lab-49071{{"二分 K 均值与常规 K 均值性能比较"}} ml/sklearn -.-> lab-49071{{"二分 K 均值与常规 K 均值性能比较"}} end

导入库

在这一步中,我们将导入本教程所需的必要库。

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import BisectingKMeans, KMeans

生成样本数据

在这一步中,我们将使用 scikit-learn 中的 make_blobs() 函数生成样本数据。我们将生成 10000 个样本,有 2 个聚类中心。

n_samples = 10000
random_state = 0
X, _ = make_blobs(n_samples=n_samples, centers=2, random_state=random_state)

定义聚类数和算法

在这一步中,我们将定义 KMeans 和二分 KMeans 的聚类中心数量。我们还将定义要比较的算法。

n_clusters_list = [4, 8, 16]
clustering_algorithms = {
    "Bisecting K-Means": BisectingKMeans,
    "K-Means": KMeans,
}

可视化结果

在这一步中,我们将使用子图来可视化算法的结果。我们将使用散点图来表示数据点和聚类中心。我们将遍历每种算法以及要比较的聚类数量,并绘制结果。

fig, axs = plt.subplots(len(clustering_algorithms), len(n_clusters_list), figsize=(12, 5))
axs = axs.T

for i, (algorithm_name, Algorithm) in enumerate(clustering_algorithms.items()):
    for j, n_clusters in enumerate(n_clusters_list):
        algo = Algorithm(n_clusters=n_clusters, random_state=random_state, n_init=3)
        algo.fit(X)
        centers = algo.cluster_centers_

        axs[j, i].scatter(X[:, 0], X[:, 1], s=10, c=algo.labels_)
        axs[j, i].scatter(centers[:, 0], centers[:, 1], c="r", s=20)

        axs[j, i].set_title(f"{algorithm_name} : {n_clusters} clusters")

for ax in axs.flat:
    ax.label_outer()
    ax.set_xticks([])
    ax.set_yticks([])

plt.show()

总结

本教程使用从 scikit-learn 生成的样本数据,比较了常规 K-Means 算法和二分 K-Means 算法的性能。我们使用子图可视化结果,其中散点图表示数据点和聚类中心。我们发现,二分 K-Means 算法倾向于创建具有更规则大规模结构的聚类,而常规 K-Means 算法在增加聚类数时会创建不同的聚类。