K 均值聚类是一种把数值数据分成 个簇的方法。如果你先选定 ,并使用标准的欧几里得版本,算法就会重复执行一个循环:先把每个点分配给最近的中心,再把每个中心移动到分配给它的那些点的平均值位置。
通俗地说,它会尽量让同一组里的点彼此更接近,让不同组之间的点更远一些。它速度快、很实用,但只有在这些“组”比较紧凑且距离确实有意义时,效果才会好。
K 均值聚类在优化什么
在标准的欧几里得形式下,K 均值会尽量让每个簇内部的点尽可能靠近该簇的质心。一个常见的目标函数是
这里, 是第 个簇, 是它的质心。
这就是簇内平方和。这个值越小,说明被分配到各簇中的点越紧密地围绕各自的质心分布。
这个目标函数解释了算法的两个部分:
- 如果质心固定,最好的做法就是把每个点分配给离它最近的质心。
- 如果分配结果固定,最好的质心就是这些已分配点的平均值。
这就是为什么更新规则不是随意定的。K 均值里的 “means” 指的就是字面意义上的算术平均值。
K 均值算法如何工作
常见的循环过程很短:
- 选择 个初始质心。
- 将每个点分配给最近的质心。
- 将每个质心重新计算为其所属点的平均值。
- 重复以上步骤,直到分配结果不再变化,或者改进已经非常小。
这个过程通常会很快收敛,但不一定能得到全局最优的聚类结果。不同的初始质心可能会导向不同的最终答案,所以初始化很重要。
K 均值聚类示例:一步一步来看
来看下面这些一维数据点:
假设我们想要 个簇,并且初始质心设为 和 。这是一个很好的例子,因为第一次更新之后,质心确实会发生移动。
第 1 步:把点分配给最近的质心
点 更接近 。
点 更接近 。
所以簇为
第 2 步:更新质心
第一个簇的新质心是
第二个簇的新质心是
两个质心都移动了,分别从 移到 ,从 移到 。
第 3 步:再次分配
现在用 和 再次检查最近的质心。
点 仍然属于第一个簇,点 仍然属于第二个簇。因为分配结果不再变化,算法已经收敛。
这是一个很干净的例子,因为这些数据天然就分成了两个紧凑的组。真实数据集通常会更复杂,而这也正是 K 均值开始误导你的地方。
K 均值什么时候效果好
当下面这些条件大致成立时,K 均值通常效果最好:
- 特征是数值型的。
- 欧几里得距离是衡量相似性的合理方式。
- 各个簇比较紧凑,而不是又长又弯。
- 特征已经做过缩放,这样某一个变量不会压过其他变量。
如果这些条件不成立,输出结果看起来仍然可能很整齐,但却错过了数据中的真实结构。
K 均值的常见错误
把 K 均值当成通用聚类方法
K 均值最适合簇比较紧凑、并且平均值能够合理概括数据的情况。它并不是所有数据集的默认最佳选择。
忽略特征缩放
如果某个特征的量纲远大于另一个特征,它就可能主导距离计算。在运行 K 均值之前,对特征做标准化或归一化通常很重要。
认为答案是唯一的
K 均值从不同的初始点出发,可能会收敛到不同的局部最小值。这就是为什么人们通常会重复运行多次,或者使用 k-means++ 这样的初始化方法。
使用非数值特征或编码不合理的特征
因为质心是平均值,所以标准 K 均值是为数值变量设计的。如果某个特征是类别型的,计算算术平均值可能没有意义。
用它处理明显非球形的簇
如果真实的组是细长的、弯曲的,或者密度差异很大,K 均值可能会把一个自然的组拆开,或者把两个不同的组合并。这个方法偏好紧凑、以质心为中心的簇。
忘记离群点会拉动质心
因为质心是平均值,极端值会明显改变质心的位置。如果你的数据中离群点很重要,在相信结果之前一定要先检查这一点。
K 均值聚类用在哪里
K 均值常用于探索性分组、客户或行为分群、图像颜色量化,以及作为无监督学习中的一个快速基线方法。
当你拥有数值特征、想要一个快速简单的模型,并且预期簇在欧几里得空间中大致是紧凑的,它就尤其有用。
一个简单的心智模型
想象你在散点图上放置了 个可以移动的图钉。每个点都会连到最近的图钉上。然后,每个图钉再滑动到连接到它的那些点的平均位置。不断重复,直到这些图钉几乎不再移动。
这不只是一个直觉图景。它几乎就是整个算法本身。
试着做一个类似的聚类问题
取一小组数轴上的点,设定 ,然后手动完成一次完整的“分配—更新”循环。接着改变初始质心,或者加入一个离群点,看看结果会如何变化。如果你想再进一步,可以在一个小数据集上自己试一版,并比较特征缩放前后会发生什么。