K-means 的全部内容就是两句话:把每个点分给最近的质心, 把每个质心挪到它那堆的中间。反复做,直到质心不动。 这一页可以一步一步走,看质心怎么挪;也可以切到同心圆, 看它怎么把一个明摆着的结构彻底切错。
聚类的目标可以写得非常朴素:让每个点到它所属簇中心的距离平方和尽可能小。 这个量叫 inertia(簇内平方和):
右侧那张图画的正是它——每次都只会往下走,不会往上,所以算法一定能停。
两步都在把 往下压,所以 J 单调不增、算法必然收敛。但注意:每一步都是"固定另一半"的最优, 合起来只能保证停在局部最优——这就是它挑初始质心的根本原因。
「分给最近的质心」这个规则,在平面上等价于用直线把空间切开 (两个质心连线的垂直平分线)。所以 K-means 的每个簇一定是凸的、大致等大的。
切到「同心圆」看看:内圈和外圈明明是天然的两簇,K-means 却会把外圈劈成两半—— 因为"平分"比"套一个环"更符合它的规则。想聚类这种结构得换方法 (谱聚类、DBSCAN 之类)。