通俗易懂讲透 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 把图像颜色聚类,实现图像压缩。
python
# 安装依赖
# pip install numpy matplotlib scikit-learn pillow
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import MiniBatchKMeans
from PIL import Image
# 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 加速版 ,用小批量数据增量更新质心,在损失极少精度的前提下,实现速度与内存的巨大优化,是工业界最常用的聚类算法之一。