K均值与二分K均值聚类算法性能比较

在数据科学领域,聚类算法是探索性数据分析中的重要工具。其中,K均值聚类算法因其简单性和高效性而被广泛使用。然而,当涉及到更复杂的数据结构时,二分K均值聚类算法提供了一种更为精细的解决方案。本文将对这两种算法进行比较,并展示它们在不同簇数量下的性能差异。

K均值聚类算法在增加簇的数量时,每次的聚类结果都会有所不同。这是因为算法每次初始化的簇中心点可能不同,导致最终的聚类结果也不同。而二分K均值聚类算法则是在前一次聚类结果的基础上进行的,因此它倾向于创建具有更规则的大规模结构的簇。这种差异可以通过可视化的方式观察到:对于所有的簇数量,二分K均值聚类算法总会有一条将整个数据云分割成两部分的分界线,而常规K均值聚类算法则没有这样的分界线。

为了比较这两种算法,生成了一组样本数据,并设置了不同的簇数量。然后,使用matplotlib库来绘制每种算法在不同簇数量下的聚类结果。通过这些图表,可以直观地看到不同算法在处理相同数据时的表现差异。

import matplotlib.pyplot as plt from sklearn.cluster import BisectingKMeans, KMeans from sklearn.datasets import make_blobs # 生成样本数据 n_samples = 10000 random_state = 0 X, _ = make_blobs(n_samples=n_samples, centers=2, random_state=random_state) # 设置K均值和二分K均值的簇数量 n_clusters_list = [4, 8, 16] # 定义比较的算法 clustering_algorithms = { "二分K均值": BisectingKMeans, "K均值": 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}个簇") # 隐藏顶部子图的x标签和刻度标签,以及右侧子图的y刻度标签 for ax in axs.flat: ax.label_outer() ax.set_xticks([]) ax.set_yticks([]) plt.show()

通过上述代码,可以看到在不同的簇数量下,两种算法的聚类结果。二分K均值聚类算法在处理大规模数据结构时,能够更好地保持簇的规则性,而K均值聚类算法则在每次运行时可能会产生不同的聚类结果。这种差异对于需要稳定聚类结果的应用场景尤为重要。

此外,还可以通过运行脚本来获取Jupyter笔记本、Python源代码以及压缩包下载链接。这些资源可以帮助用户更深入地了解算法的实现细节,并在自己的数据集上进行实验。

最后,还提供了一些相关的示例,包括K均值假设的演示、K均值与MiniBatchKMeans聚类算法的比较、K均值++初始化的示例以及K均值初始化对聚类影响的实证评估。这些示例可以帮助用户更好地理解聚类算法的工作原理和应用场景。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485