在本文中,将探讨两种流行的聚类算法:MiniBatchKMeans和BIRCH。这些算法在处理大规模数据集时表现出了良好的可扩展性,能够高效地处理数十万甚至数百万的数据点。为了保持持续集成资源使用合理,选择限制这个示例中的数据集大小,但感兴趣的读者可能会喜欢编辑这个脚本来用更大的n_samples值重新运行它。
如果将n_clusters设置为None,数据将从25,000个样本减少到158个聚类。这可以被视为最终(全局)聚类步骤之前的预处理步骤,该步骤进一步将这158个聚类减少到100个聚类。不包含全局聚类作为最后一步的BIRCH耗时0.47秒,n_clusters: 158。包含全局聚类作为最后一步的BIRCH耗时0.47秒,n_clusters: 100。运行MiniBatchKMeans耗时0.18秒。
以下是实现这一比较的Python代码。首先,导入必要的库,并生成一个合成数据集,然后使用BIRCH和MiniBatchKMeans算法对数据进行聚类,并比较它们的性能。
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
# 生成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]))
# 生成blobs以比较MiniBatchKMeans和BIRCH。
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(f"BIRCH {info} as the final step took {(time() - t):.2f} seconds")
# 绘制结果
labels = birch_model.labels_
centroids = birch_model.subcluster_centers_
n_clusters = np.unique(labels).size
print(f"n_clusters: {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(f"BIRCH {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(f"Time taken to run MiniBatchKMeans {t_mini_batch:.2f} seconds")
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都是优秀的聚类算法,它们在处理大规模数据集时表现出了良好的性能。通过比较这两种算法,可以更好地理解它们在不同场景下的应用和优势。此外,通过调整算法参数,还可以进一步优化聚类结果,以满足特定的业务需求。
在实际应用中,选择合适的聚类算法需要考虑多个因素,包括数据集的大小、特征的维度、以及业务需求等。MiniBatchKMeans和BIRCH都是值得考虑的选项,它们在处理大规模数据集时的高效性能,使得它们在许多领域都有广泛的应用。