/K-means 聚类
演示中
1

先随手放下 3 个质心(带十字的圆圈)

概率与统计

K-means 聚类

没人教,电脑怎么自己把数据分成几群?

没人教,电脑怎么自己把数据分成几群?

给你一张散点图:上千个顾客,按"年消费"和"来店次数"两个数值散落在平面上。没人提前告诉电脑"哪些是高价值客户、哪些是路人",可它却能自己把这堆点分成几群、找出"人以群分"的结构。

它用的常常就是一个朴素得惊人的办法——K-means 聚类。神奇的是,它从头到尾没有任何标准答案可看,全靠点与点之间的远近,自己摸索出分组。

朴素到不可思议的两步

先说好要分成几群,比如 k=3k=3。然后:

  1. 随手放下 3 个"中心"(质心)。位置随便,先放着。
  2. 分配:让每个点投靠离它最近的那个质心,染成对应颜色。
  3. 更新:把每个质心,挪到自己这群点的正中央(坐标取平均)。

然后呢?回到第 2 步,再来一遍。 质心移动了,有些点离另一个质心更近了,就改投门庭;质心于是又被拉到新的中心……

分配、更新、分配、更新…… 每一轮,分群都比上一轮更"干净"一点。

直到某一轮,谁也不再换队、质心也不再移动——收敛了。这堆点就被自然地分好了群。动画里你能看到质心一步步滑向各自人群的正中央。

它到底在最小化什么

这个看似"凭感觉"的过程,其实在悄悄优化一个明确的目标:让每个点到自己质心的距离尽可能小。用公式说,就是最小化簇内平方和:

J=ixiμci2J = \sum_{i} \lVert x_i - \mu_{c_i} \rVert^2

其中 xix_i 是第 ii 个点,cic_i 是它被分到的簇,μci\mu_{c_i} 是那个簇的质心。"分配"和"更新"这两步,各自都在让 JJ 变小,所以算法一定会停下来。

这里的"距离",通常就是我们最熟悉的欧氏距离——所以 K-means 本质上是一道按距离分组的题(和 [[taxicab-geometry]] 是近亲;换一种距离,聚类的"形状"也会变)。

一个要当心的地方

K-means 有个脾气:结果依赖你最初随手放的那几个质心。 起点不同,有时会收敛到不一样的分组,甚至卡在一个不太好的结果上。

动画里点一下「换一组初始质心」,你就能亲眼看到:同一堆点,换个起点,分群可能就变了样。所以实践中常常多跑几次、取最好的一次(比如让 JJ 最小),或者用更聪明的初始化(如 K-means++)来开个好头。

它藏在哪些地方

  • 客户分群:电商、银行按消费行为把用户分类,做精准运营。
  • 图像处理:把一张图的颜色聚成几种,实现压缩或卡通化。
  • 数据探索:面对没标签的新数据,先聚类看看"长几堆",是分析的第一步。

下次看到"用户画像"“智能分类”,背后很可能就是这套"放中心、抢点、挪中心"的简单循环,一遍遍跑出来的。

同分类推荐
骰子的概率

为什么两个骰子掷出 7 的概率最大?