通俗易懂讲透 Mini-Batch K-means(本科生/研究生都能看懂)
Mini-Batch K-means 就是标准 K-means 的高速版,专门解决大数据跑不动的问题。本文用大白话+通俗案例+核心公式+可直接运行代码,从零讲透,适合课堂笔记、实验报告。
一、先回顾:K-means 是什么?
聚类就是把相似的数据分到一组,K-means 是最经典的聚类算法。
标准 K-means 流程:
- 随机选 K 个点作为质心(簇中心)
- 每个点分配到最近的质心
- 重新计算每个簇的平均值作为新质心
- 重复直到质心不再变化
痛点:数据量几百万、上千万时,每次都遍历全量数据,太慢、太占内存。
二、Mini-Batch K-means 到底是什么?
一句话:
每次只抽一小批数据(Mini-Batch)更新质心,不跑全量数据,速度大幅提升,结果近似标准 K-means。
可以这么理解:
- 标准 K-means:全班一起考试,算平均分
- Mini-Batch K-means:随机抽几组同学考试,用这几组慢慢调整平均分
三、超通俗案例:用兴趣爱好给朋友分组
我们用 10 个朋友的「唱歌、跳舞、画画」评分,演示 Mini-Batch K-means 怎么做。
数据
| 朋友 | 唱歌 | 跳舞 | 画画 |
|---|---|---|---|
| A | 8 | 2 | 1 |
| B | 7 | 3 | 2 |
| C | 1 | 8 | 2 |
| D | 2 | 7 | 3 |
| E | 2 | 1 | 9 |
| F | 3 | 2 | 8 |
| G | 8 | 1 | 2 |
| H | 7 | 2 | 1 |
| I | 1 | 9 | 2 |
| J | 3 | 8 | 2 |
步骤(极简版)
- 初始化:随机选 A、C 作为两个质心
- 抽一小批:比如抽 B、D、F
- 算距离:用欧几里得距离看谁离哪个质心近
- 分配簇:B→簇1,D→簇2,F→簇1
- 更新质心:只用这批数据更新,不用全量
- 重复:再抽一批,继续更新,直到稳定
四、核心公式(看懂就能写报告)
1. 标准 K-means 目标函数
最小化所有点到质心的平方距离和:
J=∑i=1N∑k=1Krik∥xi−μk∥2 J=\sum_{i=1}^{N} \sum_{k=1}^{K} r_{i k}\left\| x_{i}-\mu_{k}\right\| ^{2}J=i=1∑Nk=1∑Krik∥xi−μk∥2
- (N):总样本数
- (K):簇数量
- xix_ixi:第iii个样本
- μk\mu_kμk:第kkk个质心
- rikr_{ik}rik:样本iii是否属于簇kkk(0 或 1)
2. Mini-Batch 目标函数
只优化当前小批量数据:
Jmini=∑i∈batch∑k=1Krik∥xi−μk∥2 J_{mini }=\sum_{i \in batch } \sum_{k=1}^{K} r_{i k}\left\| x_{i}-\mu_{k}\right\| ^{2}Jmini=i∈batch∑k=1∑Krik∥xi−μk∥2
3. 分配规则(最近质心)
rik={1k=argminj∥xi−μj∥20否则 r_{i k}= \begin{cases}1 & k=arg min _{j}\left\| x_{i}-\mu_{j}\right\| ^{2} \\ 0 & 否则 \end{cases}rik={10k=argminj∥xi−μj∥2否则
4. 质心更新(最重要!)
Mini-Batch 用增量学习更新,不是重新算均值:
μk(t+1)=μk(t)+η⋅(xi−μk(t)) \mu_{k}^{(t+1)}=\mu_{k}^{(t)}+\eta \cdot\left(x_{i}-\mu_{k}^{(t)}\right)μk(t+1)=μk(t)+η⋅(xi−μk(t))
- η=1tk\eta = \frac{1}{t_k}η=tk1:学习率(更新次数越多,步长越小)
- tkt_ktk:该质心被更新的次数
- 好处:不用存全量数据,计算极快
五、Mini-Batch K-means 完整算法流程
- 随机初始化 K 个质心
- 从全量数据中随机抽取一个 Mini-Batch
- 对 Batch 内样本:计算距离 → 分配到最近簇
- 用增量公式更新质心
- 重复抽取 Batch、更新,直到质心收敛或达到最大迭代次数
六、实战代码:图像压缩(可直接复制运行)
最经典应用:用 Mini-Batch K-means 把图像颜色聚类,实现图像压缩。
# 安装依赖# pip install numpy matplotlib scikit-learn pillowimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.clusterimportMiniBatchKMeansfromPILimportImage# 1. 加载图片并转为 RGB 数组image=Image.open("lenna.jpg").convert("RGB")image=np.array(image)rows,cols,_=image.shape# 2. 把图像展平为 (像素数, 3) 的格式X=image.reshape(-1,3)# 3. 设置聚类参数n_colors=16# 压缩成 16 种颜色batch_size=1024# 小批量大小# 4. Mini-Batch K-means 聚类mb_kmeans=MiniBatchKMeans(n_clusters=n_colors,batch_size=batch_size,random_state=42)mb_kmeans.fit(X)# 5. 生成压缩图像labels=mb_kmeans.predict(X)centers=mb_kmeans.cluster_centers_.astype("uint8")compressed=centers[labels].reshape(rows,cols,3)# 6. 对比显示plt.figure(figsize=(12,5))plt.subplot(1,2,1)plt.imshow(image)plt.title("原始图像",fontsize=14)plt.axis("off")plt.subplot(1,2,2)plt.imshow(compressed)plt.title(f"压缩图像({n_colors}色)",fontsize=14)plt.axis("off")plt.tight_layout()plt.show()代码说明
n_colors:压缩后颜色数量,越小压缩率越高batch_size:一般设 256/512/1024,越大越接近标准 K-means- 速度优势:千万像素级图像也能秒级处理
七、Mini-Batch K-means 优缺点(面试/报告必背)
✅ 优点
- 速度极快:不用遍历全量数据,复杂度远低于 (O(N))
- 省内存:适合超大规模数据(百万+)
- 支持流式数据:可以一边来数据一边更新
- 近似效果好:多迭代几次,几乎接近 K-means
- 易分布式/ GPU 加速
❌ 缺点
- 精度略低于 K-means(小数据集不推荐)
- 对初始质心敏感
- 只适合欧式距离、凸簇
- 需要调 batch_size
八、适用场景(什么时候用?)
👉 必须用 Mini-Batch K-means
- 数据量超内存、千万级以上
- 需要快速出结果
- 流式/在线学习
- 图像压缩、颜色量化、用户分群、大数据预处理
👉 不要用
- 小数据集(直接 K-means)
- 非凸、复杂形状簇(用 DBSCAN)
- 超高维稀疏数据(用谱聚类)
九、一句话总结
Mini-Batch K-means 是大数据场景下的 K-means 加速版,用小批量数据增量更新质心,在损失极少精度的前提下,实现速度与内存的巨大优化,是工业界最常用的聚类算法之一。