K 均值聚类是一种把数值数据分成 kk 个簇的方法。如果你先选定 kk,并使用标准的欧几里得版本,算法就会重复执行一个循环:先把每个点分配给最近的中心,再把每个中心移动到分配给它的那些点的平均值位置。

通俗地说,它会尽量让同一组里的点彼此更接近,让不同组之间的点更远一些。它速度快、很实用,但只有在这些“组”比较紧凑且距离确实有意义时,效果才会好。

K 均值聚类在优化什么

在标准的欧几里得形式下,K 均值会尽量让每个簇内部的点尽可能靠近该簇的质心。一个常见的目标函数是

j=1kxiCjxiμj2\sum_{j=1}^{k} \sum_{x_i \in C_j} \|x_i - \mu_j\|^2

这里,CjC_j 是第 jj 个簇,μj\mu_j 是它的质心。

这就是簇内平方和。这个值越小,说明被分配到各簇中的点越紧密地围绕各自的质心分布。

这个目标函数解释了算法的两个部分:

  • 如果质心固定,最好的做法就是把每个点分配给离它最近的质心。
  • 如果分配结果固定,最好的质心就是这些已分配点的平均值。

这就是为什么更新规则不是随意定的。K 均值里的 “means” 指的就是字面意义上的算术平均值。

K 均值算法如何工作

常见的循环过程很短:

  1. 选择 kk 个初始质心。
  2. 将每个点分配给最近的质心。
  3. 将每个质心重新计算为其所属点的平均值。
  4. 重复以上步骤,直到分配结果不再变化,或者改进已经非常小。

这个过程通常会很快收敛,但不一定能得到全局最优的聚类结果。不同的初始质心可能会导向不同的最终答案,所以初始化很重要。

K 均值聚类示例:一步一步来看

来看下面这些一维数据点:

1, 2, 3, 10, 11, 121,\ 2,\ 3,\ 10,\ 11,\ 12

假设我们想要 k=2k = 2 个簇,并且初始质心设为 111010。这是一个很好的例子,因为第一次更新之后,质心确实会发生移动。

第 1 步:把点分配给最近的质心

1,2,31, 2, 3 更接近 11

10,11,1210, 11, 12 更接近 1010

所以簇为

C1={1,2,3},C2={10,11,12}C_1 = \{1,2,3\}, \qquad C_2 = \{10,11,12\}

第 2 步:更新质心

第一个簇的新质心是

μ1=1+2+33=2\mu_1 = \frac{1+2+3}{3} = 2

第二个簇的新质心是

μ2=10+11+123=11\mu_2 = \frac{10+11+12}{3} = 11

两个质心都移动了,分别从 11 移到 22,从 1010 移到 1111

第 3 步:再次分配

现在用 221111 再次检查最近的质心。

1,2,31, 2, 3 仍然属于第一个簇,点 10,11,1210, 11, 12 仍然属于第二个簇。因为分配结果不再变化,算法已经收敛。

这是一个很干净的例子,因为这些数据天然就分成了两个紧凑的组。真实数据集通常会更复杂,而这也正是 K 均值开始误导你的地方。

K 均值什么时候效果好

当下面这些条件大致成立时,K 均值通常效果最好:

  • 特征是数值型的。
  • 欧几里得距离是衡量相似性的合理方式。
  • 各个簇比较紧凑,而不是又长又弯。
  • 特征已经做过缩放,这样某一个变量不会压过其他变量。

如果这些条件不成立,输出结果看起来仍然可能很整齐,但却错过了数据中的真实结构。

K 均值的常见错误

把 K 均值当成通用聚类方法

K 均值最适合簇比较紧凑、并且平均值能够合理概括数据的情况。它并不是所有数据集的默认最佳选择。

忽略特征缩放

如果某个特征的量纲远大于另一个特征,它就可能主导距离计算。在运行 K 均值之前,对特征做标准化或归一化通常很重要。

认为答案是唯一的

K 均值从不同的初始点出发,可能会收敛到不同的局部最小值。这就是为什么人们通常会重复运行多次,或者使用 k-means++ 这样的初始化方法。

使用非数值特征或编码不合理的特征

因为质心是平均值,所以标准 K 均值是为数值变量设计的。如果某个特征是类别型的,计算算术平均值可能没有意义。

用它处理明显非球形的簇

如果真实的组是细长的、弯曲的,或者密度差异很大,K 均值可能会把一个自然的组拆开,或者把两个不同的组合并。这个方法偏好紧凑、以质心为中心的簇。

忘记离群点会拉动质心

因为质心是平均值,极端值会明显改变质心的位置。如果你的数据中离群点很重要,在相信结果之前一定要先检查这一点。

K 均值聚类用在哪里

K 均值常用于探索性分组、客户或行为分群、图像颜色量化,以及作为无监督学习中的一个快速基线方法。

当你拥有数值特征、想要一个快速简单的模型,并且预期簇在欧几里得空间中大致是紧凑的,它就尤其有用。

一个简单的心智模型

想象你在散点图上放置了 kk 个可以移动的图钉。每个点都会连到最近的图钉上。然后,每个图钉再滑动到连接到它的那些点的平均位置。不断重复,直到这些图钉几乎不再移动。

这不只是一个直觉图景。它几乎就是整个算法本身。

试着做一个类似的聚类问题

取一小组数轴上的点,设定 k=2k = 2,然后手动完成一次完整的“分配—更新”循环。接着改变初始质心,或者加入一个离群点,看看结果会如何变化。如果你想再进一步,可以在一个小数据集上自己试一版,并比较特征缩放前后会发生什么。

需要解题帮助?

上传你的问题,几秒钟内获得经过验证的分步解答。

打开 GPAI Solver →