简介
这是一篇逐步指导教程,用于比较常规 K 均值算法和二分 K 均值算法的性能。本教程将展示这些算法在聚类时随着聚类数(n_clusters)增加而产生的差异。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
导入库
在这一步中,我们将导入本教程所需的必要库。
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 算法在增加聚类数时会创建不同的聚类。