客户分群是 AI 在商业里最常见的用法之一:手上有几万个客户,没有现成标签,想知道能不能自然分成几群,每群的特征不一样。K-means 就是为这类问题准备的,给定要分成几组,它反复调整每个组的中心,直到分组稳定。它是无监督学习里最常被第一个尝试的方法,也是被误用最多的一种。很多人把它当成自动发现类别的工具,而它实际上只做一件事:在你指定的组数下,找一个让组内尽量紧凑的划分。
它优化的是一件很具体的事
K-means 的目标可以一句话说清:让每个样本到它所属中心的距离平方和尽量小。这个目标函数决定了它的全部行为。它不关心组和组之间是否有意义上的差别,只关心几何上的紧凑程度。所以「分出来的组有没有业务含义」这件事,算法完全不负责,需要人去看每组的画像再判断。这也是为什么同一份数据换一组特征跑 K-means,会得到完全不同的分组,而每一组在数学上都算「最优」。
两步交替,以及它为什么一定会停
整个算法只有两个动作,交替执行:
| 步骤 | 做什么 | 为什么这样设计 |
|---|---|---|
| 指派 | 把每个样本分给最近的中心 | 固定中心时,这是让总距离最小的分法 |
| 更新 | 把中心移到该组样本的均值位置 | 固定分组时,均值是让距离平方和最小的点 |
| 重复 | 直到分组不再变化 | 每步都让目标函数下降,而它不可能无限下降 |
两步各自都在做「在当前条件下最优」的选择,所以总目标只降不升,而可能的划分数量有限,因此一定会收敛。但收敛到的不一定是全局最优。这是一个典型的局部最优问题:它停在哪个解,取决于一开始中心放在哪里。
K 得你来定,这件事没法回避
K-means 不会告诉你数据里有几类。它拿到 K,就一定会给出 K 个组,哪怕数据本来是一整团没有结构的点,它也能硬切出 K 块,而且看上去还挺整齐。这是它最容易被忽略的性质。选 K 的常用手段有两种:肘部法看组内误差随 K 变化的曲线在哪里开始变缓,轮廓系数衡量组内紧、组间远的程度。两种方法都只能提供参考,最终往往要靠业务约束定夺——运营只能维护三档客户,那 K 就取三,指标再好看也未必能落地。
它只能找到形状规整的簇
K-means 隐含假设每个簇是围绕中心的一团,形状接近球形、大小相近。数据如果是环形、月牙形,或者密度差别很大,它会切得很别扭:一个环被从中间劈成两半,或者一个大簇被拆成几个小簇。这不是参数没调好,是目标函数决定的——用距离平方和衡量紧凑度,天生就偏向等大的球形。遇到这类数据,基于密度的 DBSCAN 或层次聚类更合适,它们不预设簇的形状,代价是要换一套参数和判断标准。
初始化为什么能左右结果
随机撒下 K 个中心,很可能有两个落在同一团数据里,另一个团完全没有中心,最后那个团会被强行拆开。常见的补救是多次随机初始化,取目标函数最小的那次,这也是很多工具库里默认做的事。更进一步的改进是按距离尽量远地依次挑选初始中心,让它们一开始就分散开。这些做法降低了踩坑概率,但没有消除问题:它依然是一个对初始条件敏感的方法,换一个随机种子,分组可能变。
结果靠不靠谱,看三件事
先看每个簇的样本量,出现只有几条样本的簇,通常意味着 K 给大了或者有离群点。再看簇中心的实际含义,把中心换算回原始特征,看能不能用一句业务语言描述出来,描述不出来往往说明特征选得不对。最后看稳定性,换个随机种子或换一批同分布数据重跑,分组结构是否大体一致,变化剧烈说明数据里本来就没有清晰的结构。这三项检查不需要额外工具,却能挡掉大部分「看起来分了组、实际没有意义」的结果。距离怎么算同样影响结论,量纲不统一时,可参考余弦相似度与欧氏距离的取舍,必要时先用 PCA 降维再聚类。
速查:K-means 的四条硬约束
- K 由人给,算法只负责在你给的 K 下划分
- 目标函数是组内距离平方和,只认紧凑、不认含义
- 假设簇近似球形且大小相近,环形数据会切错
- 结果依赖初始中心,多次重启是常规操作


