sklearn.cluster.MiniBatchKMeans
(小批量 K 均值聚类)
MiniBatchKMeans
是 sklearn.cluster
提供的 小批量 K 均值聚类(MiniBatch K-Means) 方法,它是 KMeans
的改进版本,适用于 大规模数据集,通过 小批量随机梯度更新 来加速计算,减少内存使用。
1. MiniBatchKMeans
vs. KMeans
模型 | 适用情况 | 主要区别 |
---|---|---|
KMeans | 标准 K 均值聚类 | 计算成本较高,每次迭代使用所有数据 |
MiniBatchKMeans | 适用于大规模数据 | 每次使用一个小批量数据进行更新,提高速度 |
对比
KMeans
每次迭代使用所有数据,计算开销大,适用于小规模数据。MiniBatchKMeans
每次迭代仅使用一个小批量数据,计算更快,适用于大规模数据。
2. MiniBatchKMeans
代码示例
(1) 训练 MiniBatchKMeans
聚类模型
from sklearn.cluster import MiniBatchKMeans
import numpy as np
# 生成数据
X = np.random.rand(1000, 2) # 1000 个二维点
# 训练 MiniBatchKMeans 聚类模型
model = MiniBatchKMeans(n_clusters=5, batch_size=50, random_state=42)
model.fit(X)
# 预测簇标签
labels = model.predict(X)
print("簇标签:", labels[:10])
解释
n_clusters=5
:指定 5 个聚类簇。batch_size=50
:每次迭代仅使用 50 个数据点进行计算,提高速度。fit(X)
:训练MiniBatchKMeans
,更新质心。
3. MiniBatchKMeans
主要参数
MiniBatchKMeans(n_clusters=5, batch_size=50, max_iter=100, random_state=42)
参数 | 说明 |
---|---|
n_clusters | 聚类数(默认 8 ,值越大,计算复杂度越高) |
batch_size | 小批量大小(默认 100 ,值越大,计算更精确,但速度下降) |
max_iter | 最大迭代次数(默认 100 ,用于避免收敛失败) |
init | 初始化方法(默认 "k-means++" ,可选 "random" ) |
random_state | 随机种子(控制初始化一致性) |
4. 选择最佳聚类数 (n_clusters
)
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score
# 计算不同 K 值下的轮廓系数
K_values = range(2, 10)
sil_scores = []
for k in K_values:
model = MiniBatchKMeans(n_clusters=k, batch_size=50, random_state=42)
labels = model.fit_predict(X)
sil_scores.append(silhouette_score(X, labels))
# 绘制轮廓系数曲线
plt.plot(K_values, sil_scores, marker="o")
plt.xlabel("聚类数 (K)")
plt.ylabel("轮廓系数")
plt.title("选择最佳 K 值")
plt.show()
解释
- 轮廓系数(Silhouette Score) 衡量聚类质量,值越大越好。
- 观察折点(Elbow Point) 选择最佳
K
。
5. MiniBatchKMeans
可视化
import seaborn as sns
sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=labels, palette="coolwarm")
plt.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1], s=200, c="black", marker="X", label="Centroids")
plt.legend()
plt.title("MiniBatchKMeans 聚类结果")
plt.show()
解释
- 黑色
X
标记质心位置。
6. 计算聚类性能
from sklearn.metrics import silhouette_score
score = silhouette_score(X, labels)
print("轮廓系数:", score)
解释
silhouette_score(X, labels)
:评估聚类效果(值越大越好)。
7. MiniBatchKMeans
vs. KMeans
from sklearn.cluster import KMeans
import time
# 计算 KMeans 训练时间
start = time.time()
kmeans_model = KMeans(n_clusters=5, random_state=42)
kmeans_model.fit(X)
print("KMeans 训练时间:", time.time() - start)
# 计算 MiniBatchKMeans 训练时间
start = time.time()
minibatch_model = MiniBatchKMeans(n_clusters=5, batch_size=50, random_state=42)
minibatch_model.fit(X)
print("MiniBatchKMeans 训练时间:", time.time() - start)
解释
MiniBatchKMeans
训练速度快于KMeans
,适用于大规模数据集。
8. MiniBatchKMeans
vs. DBSCAN
vs. AgglomerativeClustering
方法 | 适用情况 | 主要区别 |
---|---|---|
MiniBatchKMeans | 数据均匀分布,适用于大规模数据 | 需要预设簇数,易受初始点影响 |
DBSCAN | 适用于噪声数据,簇形状不规则 | 不需预设簇数,依赖 eps 和 min_samples |
AgglomerativeClustering | 适用于层级结构的数据 | 适用于小规模数据,可视化树形结构 |
9. 适用场景
- 大规模数据聚类(如 上百万数据点)。
- 在线学习(Online Learning)(可用于 流数据处理)。
- 图像分割(如 KMeans 颜色量化)。
10. 结论
MiniBatchKMeans
适用于大规模数据集,计算速度快,效果接近KMeans
,但在小数据集上可能不如KMeans
精确。适用于 实时数据聚类、在线学习和图像处理。