什么是 K-Means?

K-Means 是一种经典的无监督聚类算法。它将数据分组到 K 个簇中。

核心直觉:

  • 随机选择 K 个中心点
  • 将每个数据点分配到最近的中心
  • 更新中心点为簇的平均值
  • 重复直到收敛

收敛条件:中心点不再变化,或达到最大迭代次数

适用场景

  • 客户分群:根据用户行为特征进行市场细分
  • 图像压缩:将颜色聚类减少颜色数量(颜色量化)
  • 文档聚类:新闻归类、主题发现
  • 异常检测:远离所有聚类中心的点可能是异常

历史渊源

问题背景:1950年代,贝尔实验室的工程师需要把连续的模拟信号转换成离散的数字信号(脉冲编码调制)。关键问题是:如何用有限个"代表值"来近似无限多的信号值,使失真最小?

关键突破:1957年,Stuart Lloyd 提出了一个迭代算法:先随机选几个代表值,把每个信号分配给最近的代表值,然后用每组的平均值更新代表值,重复直到稳定。1967年,MacQueen 正式将这个方法命名为"K-means"并推广到统计学领域。

深远影响:K-means 的"分配-更新"两步迭代思想后来被推广为 EM 算法(期望最大化),成为统计学习中最重要的框架之一。K-means 至今仍是数据分析的第一步——"先聚个类看看数据长什么样"。

趣闻:Lloyd 1957年就写好了论文,但贝尔实验室认为"太简单了"没有发表。直到1982年论文才正式出版——整整延迟了25年!这期间 MacQueen 已经独立发表了类似的方法并取了"K-means"这个名字。

发展脉络

1957
K-means
经典算法
初始点敏感
->
2007
K-means++
智能初始化
大规模数据慢
->
2010
Mini-batch K-means
增量式更新

局限性

  • 需要预设 K 值:聚类数量必须事先指定,常用肘部法则确定
  • 对初始点敏感:不同的初始化可能得到不同结果
  • 只能发现球形簇:假设聚类是凸形、各向同性的
  • 对噪声敏感:异常值会显著影响聚类中心

这些局限催生了:K-means++(智能初始化)、DBSCAN(任意形状聚类)、层次聚类(无需预设 K)

工业界地位

最常用

K-means 是最常用的聚类算法,因其简单、高效、易于理解:

  • 电商:用户画像、商品推荐分群
  • 金融:客户价值分层、风险分组
  • 图像处理:颜色量化、图像分割
  • 生物信息:基因表达数据聚类

为什么首选 K-means?实现简单、计算效率高(O(nkt))、结果直观可解释。在大多数业务场景中,K-means 已足够满足需求。

交互式可视化

调整参数,观察聚类过程如何收敛

3
20
0
试一试:
  • 点击「运行」,观察质心从随机位置逐步移向每个簇的中心
  • 改变「K 值」:K 太小,不同簇被合并;K 太大,同一个簇被拆分
  • 切换到「月牙形」数据集,观察 K-Means 的失败——它只能发现圆形簇!

聚类状态:

是否收敛: 运行中...

最终误差: --

簇内方差和:

迭代次数:

数学原理

直觉引入:把一堆散落的弹珠按颜色分组——你会先随便选几个"代表",然后把每颗弹珠归到最近的代表,再把代表移到组的中心。反复几次,分组就稳定了。K-Means 就是这个过程的数学版。

目标函数(最小化簇内方差和):

$$J = \sum_{j=1}^{K} \sum_{x_i \in C_j} ||x_i - \mu_j||^2$$

符号解释:

  • $K$:簇的数量(需要预先指定)
  • $C_j$:第 $j$ 个簇的点集
  • $\mu_j$:第 $j$ 个簇的中心(均值)
  • $||x_i - \mu_j||^2$:点到簇中心的欧氏距离平方

EM 两步迭代:

E 步(分配):将每个点分配到最近的中心

$$c_i = \arg\min_{j} ||x_i - \mu_j||^2$$

M 步(更新):重新计算每个簇的中心

$$\mu_j = \frac{1}{|C_j|} \sum_{x_i \in C_j} x_i$$
实例:K=2,4个点
数据:(1,1), (2,1), (4,3), (5,4)
初始中心:$\mu_1$=(1,1), $\mu_2$=(5,4)

第1轮 E步:(1,1)→C₁, (2,1)→C₁, (4,3)→C₂, (5,4)→C₂
第1轮 M步:$\mu_1$=(1.5, 1), $\mu_2$=(4.5, 3.5)
第2轮 E步:分配不变 → 收敛!

K-Means++ 改进:初始中心不再随机选,而是让初始中心尽量分散——第一个随机选,后续每个中心以与已选中心距离的平方为概率选取,大幅减少收敛到局部最优的风险。