机器学习 · 互动实验室

K-means 聚类

点先选最近的中心,中心再移到这堆点的平均位置

01分配最近中心02移动中心03重复到稳定
看这里
小圆点=顾客带数字的大圆点=中心虚线=中心走过的路距离按两轴显示范围缩放

文字版:K-means 聚类在做什么

K-means 处理的是没有标准答案的情况:手上只有一堆数据,想知道它们能不能自然分成几群。它的做法很朴素——先随便放 K 个中心,让每个点认最近的那个中心,再把中心挪到自己那群点的平均位置,如此往复直到不再变动。

画面上正在发生什么

播放后注意两件事交替发生:一步是「每个点选谁」(点的颜色变),一步是「中心挪到哪」(大圆点移动,虚线是它走过的路)。页面上的「本轮改变分组」会显示这一轮有多少个点换了归属——这个数字降到 0,迭代就收敛了。

切到「两条月牙」这组数据再跑一次。月牙在人眼里是两群,但 K-means 会把它们拦腰切开,因为它只会按「离哪个中心近」来划分,而这样得到的边界必然是直的。这不是它没跑好,是它的定义决定了它只能找出球状的簇。

什么时候它会骗你

  • K 是你定的,算法不会告诉你分几群才对。把 K 从 2 改到 5,同一批点会被分成完全不同的样子,而每一种结果看起来都「收敛了」。K 选错时算法不会报错,只会安静地给你一个错的分法。
  • 换个起点,结果可能不一样。点「换个起点」重跑几次。K-means 只保证收敛到某个局部最优,不保证全局最优,初始中心的位置不同,最终的分群就可能不同。实践中要么多跑几次取最好的一次,要么用 k-means++ 这类更聪明的初始化。
  • 它只找得出团状的簇。月牙、环形、细长条这些形状,K-means 都分不对。遇到这类结构要换 DBSCAN、谱聚类这些不假设簇为球形的方法。
  • 量纲不统一,结果由大数值的那一列说了算。和 KNN 一样,K-means 全程基于距离,不同特征的取值范围差几个数量级时,聚类实际上只按其中一列进行。

常见问题

K 到底该怎么选?
常用肘部法(看簇内平方和随 K 增加的下降在哪里变缓)和轮廓系数(看每个点和自己簇、最近邻簇的距离对比)。但这两个都只是参考——聚类没有标准答案,最终还是要由懂这批数据的人判断分出来的群有没有实际意义。
聚类结果怎么算「对」?
严格说没有对错,只有有没有用。因为没有真实标签可比,通常从三方面判断:换个随机种子重跑结果稳不稳、分出的群在业务或专业上说不说得通、群之间在没参与聚类的变量上有没有差异。
K-means 和 KNN 是一回事吗?
完全不同。KNN 是有监督的分类方法,需要已知标签,用邻居投票给新样本定类;K-means 是无监督的聚类方法,没有标签,自己把数据分堆。两者只是名字里都有个 K,含义也不同:前者是邻居个数,后者是簇的个数。

本页为教学合成数据,分配与中心位置按 Lloyd 迭代实时计算。

作者与维护:覃秉丰 · 关于覃秉丰 · 引用本页讲解

继续学习