通俗易懂讲透 Mini-Batch K-means

通俗易懂讲透 Mini-Batch K-means(本科生/研究生都能看懂)

Mini-Batch K-means 就是标准 K-means 的高速版,专门解决大数据跑不动的问题。本文用大白话+通俗案例+核心公式+可直接运行代码,从零讲透,适合课堂笔记、实验报告。


一、先回顾:K-means 是什么?

聚类就是把相似的数据分到一组,K-means 是最经典的聚类算法。

标准 K-means 流程:

  1. 随机选 K 个点作为质心(簇中心)
  2. 每个点分配到最近的质心
  3. 重新计算每个簇的平均值作为新质心
  4. 重复直到质心不再变化

痛点 :数据量几百万、上千万时,每次都遍历全量数据,太慢、太占内存


二、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

步骤(极简版)

  1. 初始化:随机选 A、C 作为两个质心
  2. 抽一小批:比如抽 B、D、F
  3. 算距离:用欧几里得距离看谁离哪个质心近
  4. 分配簇:B→簇1,D→簇2,F→簇1
  5. 更新质心:只用这批数据更新,不用全量
  6. 重复:再抽一批,继续更新,直到稳定

四、核心公式(看懂就能写报告)

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 完整算法流程

  1. 随机初始化 K 个质心
  2. 从全量数据中随机抽取一个 Mini-Batch
  3. 对 Batch 内样本:计算距离 → 分配到最近簇
  4. 用增量公式更新质心
  5. 重复抽取 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 优缺点(面试/报告必背)

✅ 优点

  1. 速度极快:不用遍历全量数据,复杂度远低于 (O(N))
  2. 省内存:适合超大规模数据(百万+)
  3. 支持流式数据:可以一边来数据一边更新
  4. 近似效果好:多迭代几次,几乎接近 K-means
  5. 易分布式/ GPU 加速

❌ 缺点

  1. 精度略低于 K-means(小数据集不推荐)
  2. 对初始质心敏感
  3. 只适合欧式距离、凸簇
  4. 需要调 batch_size

八、适用场景(什么时候用?)

👉 必须用 Mini-Batch K-means

  • 数据量超内存、千万级以上
  • 需要快速出结果
  • 流式/在线学习
  • 图像压缩、颜色量化、用户分群、大数据预处理

👉 不要用

  • 小数据集(直接 K-means)
  • 非凸、复杂形状簇(用 DBSCAN)
  • 超高维稀疏数据(用谱聚类)

九、一句话总结

Mini-Batch K-means 是大数据场景下的 K-means 加速版 ,用小批量数据增量更新质心,在损失极少精度的前提下,实现速度与内存的巨大优化,是工业界最常用的聚类算法之一。

相关推荐
xiaoxiaoxiaolll2 小时前
数据驱动下的人工电磁材料逆向设计与智能优化研究
人工智能·学习
happy_baymax2 小时前
基于正弦波直接移相的PSFB控制方法
开发语言
傻啦嘿哟2 小时前
如何用 Python 拆分 Word 文件:高效分割大型文档的完整指南
开发语言·c#
高斯林.神犇2 小时前
五、注解方式管理bean
java·开发语言
hoiii1872 小时前
C# 读取 CSV/Excel 文件数据至 DataGridView
开发语言·c#·excel
xiaotao1312 小时前
01-编程基础与数学基石: 常用内置库
开发语言·人工智能·python
一只大袋鼠3 小时前
MySQL 进阶:聚集函数、分组、约束、多表查询
开发语言·数据库·mysql
小程故事多_8010 小时前
Agent+Milvus,告别静态知识库,打造具备动态记忆的智能AI助手
人工智能·深度学习·ai编程·milvus
code_pgf10 小时前
Llama 3详解
人工智能·llama