BIRCH与MiniBatchKMeans算法比较

数据分析领域,选择合适的聚类算法对于处理大规模数据集至关重要。本文将对BIRCH和MiniBatchKMeans两种聚类算法进行性能比较。这两种算法都具有很好的可扩展性,能够高效地处理数十万甚至数百万的数据点。为了保持持续集成资源使用的合理性,选择限制了本示例中数据集的大小,但感兴趣的读者可以尝试修改脚本来使用更大的数据集进行测试。

如果将n_clusters设置为None,数据将从25,000个样本减少到158个聚类。这可以看作是最终(全局)聚类步骤之前的预处理步骤,该步骤进一步将这158个聚类减少到100个聚类。不包含全局聚类作为最终步骤的BIRCH耗时0.49秒,而包含全局聚类作为最终步骤的BIRCH耗时0.47秒。相比之下,MiniBatchKMeans的运行时间为0.21秒。

为了进行比较,生成了一个具有10x10网格的样本中心,然后生成了25,000个样本和2个特征的合成数据集。使用matplotlib提供的所有默认颜色,并设置了图表的大小和布局。接着,使用BIRCH算法进行了聚类,并绘制了结果。对于BIRCH模型,计算了有无最终聚类步骤的时间,并打印了结果。还绘制了聚类结果,其中每个聚类的中心点用不同的颜色表示,并且用“+”标记了每个聚类的中心。

from itertools import cycle from time import time import matplotlib.colors as colors import matplotlib.pyplot as plt import numpy as np from joblib import cpu_count from sklearn.cluster import Birch, MiniBatchKMeans from sklearn.datasets import make_blobs # 生成10x10网格的样本中心 xx = np.linspace(-22, 22, 10) yy = np.linspace(-22, 22, 10) xx, yy = np.meshgrid(xx, yy) n_centers = np.hstack((np.ravel(xx)[:, np.newaxis], np.ravel(yy)[:, np.newaxis])) # 生成25,000个样本和2个特征的合成数据集 X, y = make_blobs(n_samples=25000, centers=n_centers, random_state=0) # 使用matplotlib提供的所有默认颜色 colors_ = cycle(colors.cnames.keys()) fig = plt.figure(figsize=(12, 4)) fig.subplots_adjust(left=0.04, right=0.98, bottom=0.1, top=0.9) # 使用BIRCH算法进行聚类并绘制结果 birch_models = [ Birch(threshold=1.7, n_clusters=None), Birch(threshold=1.7, n_clusters=100), ] final_step = ["without global clustering", "with global clustering"] for ind, (birch_model, info) in enumerate(zip(birch_models, final_step)): t = time() birch_model.fit(X) print("BIRCH %s as the final step took %0.2f seconds" % (info, (time() - t))) # 绘制结果 labels = birch_model.labels_ centroids = birch_model.subcluster_centers_ n_clusters = np.unique(labels).size print("n_clusters : %d" % n_clusters) ax = fig.add_subplot(1, 3, ind + 1) for this_centroid, k, col in zip(centroids, range(n_clusters), colors_): mask = labels == k ax.scatter(X[mask, 0], X[mask, 1], c="w", edgecolor=col, marker=".", alpha=0.5) if birch_model.n_clusters is None: ax.scatter(this_centroid[0], this_centroid[1], marker="+", c="k", s=25) ax.set_ylim([-25, 25]) ax.set_xlim([-25, 25]) ax.set_autoscaley_on(False) ax.set_title("BIRCH %s" % info) # 使用MiniBatchKMeans算法进行聚类 mbk = MiniBatchKMeans(init="k-means++", n_clusters=100, batch_size=256*cpu_count(), n_init=10, max_no_improvement=10, verbose=0, random_state=0) t0 = time() mbk.fit(X) t_mini_batch = time() - t0 print("Time taken to run MiniBatchKMeans %0.2f seconds" % t_mini_batch) mbk_means_labels_unique = np.unique(mbk.labels_) ax = fig.add_subplot(1, 3, 3) for this_centroid, k, col in zip(mbk.cluster_centers_, range(n_clusters), colors_): mask = mbk.labels_ == k ax.scatter(X[mask, 0], X[mask, 1], marker=".", c="w", edgecolor=col, alpha=0.5) ax.scatter(this_centroid[0], this_centroid[1], marker="+", c="k", s=25) ax.set_xlim([-25, 25]) ax.set_ylim([-25, 25]) ax.set_title("MiniBatchKMeans") ax.set_autoscaley_on(False) plt.show()

通过上述代码,可以看到MiniBatchKMeans算法在处理相同数据集时的运行时间比BIRCH算法短。这可能是因为MiniBatchKMeans算法采用了小批量处理的方式,从而提高了计算效率。然而,BIRCH算法在不包含全局聚类步骤的情况下,其运行时间与包含全局聚类步骤的BIRCH算法相近,这表明BIRCH算法在处理大规模数据集时具有较好的性能。

在实际应用中,选择哪种聚类算法取决于具体的数据集和业务需求。如果数据集非常大,且对计算资源有限制,可以考虑使用MiniBatchKMeans算法。如果数据集不是特别大,或者需要更精细的聚类结果,可以考虑使用BIRCH算法。此外,还可以根据实际情况调整算法的参数,以获得更好的聚类效果。

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