没人教,电脑怎么自己把数据分成几群?
给你一张散点图:上千个顾客,按"年消费"和"来店次数"两个数值散落在平面上。没人提前告诉电脑"哪些是高价值客户、哪些是路人",可它却能自己把这堆点分成几群、找出"人以群分"的结构。
它用的常常就是一个朴素得惊人的办法——K-means 聚类。神奇的是,它从头到尾没有任何标准答案可看,全靠点与点之间的远近,自己摸索出分组。
朴素到不可思议的两步
先说好要分成几群,比如 。然后:
- 随手放下 3 个"中心"(质心)。位置随便,先放着。
- 分配:让每个点投靠离它最近的那个质心,染成对应颜色。
- 更新:把每个质心,挪到自己这群点的正中央(坐标取平均)。
然后呢?回到第 2 步,再来一遍。 质心移动了,有些点离另一个质心更近了,就改投门庭;质心于是又被拉到新的中心……
分配、更新、分配、更新…… 每一轮,分群都比上一轮更"干净"一点。
直到某一轮,谁也不再换队、质心也不再移动——收敛了。这堆点就被自然地分好了群。动画里你能看到质心一步步滑向各自人群的正中央。
它到底在最小化什么
这个看似"凭感觉"的过程,其实在悄悄优化一个明确的目标:让每个点到自己质心的距离尽可能小。用公式说,就是最小化簇内平方和:
其中 是第 个点, 是它被分到的簇, 是那个簇的质心。"分配"和"更新"这两步,各自都在让 变小,所以算法一定会停下来。
这里的"距离",通常就是我们最熟悉的欧氏距离——所以 K-means 本质上是一道按距离分组的题(和 [[taxicab-geometry]] 是近亲;换一种距离,聚类的"形状"也会变)。
一个要当心的地方
K-means 有个脾气:结果依赖你最初随手放的那几个质心。 起点不同,有时会收敛到不一样的分组,甚至卡在一个不太好的结果上。
动画里点一下「换一组初始质心」,你就能亲眼看到:同一堆点,换个起点,分群可能就变了样。所以实践中常常多跑几次、取最好的一次(比如让 最小),或者用更聪明的初始化(如 K-means++)来开个好头。
它藏在哪些地方
- 客户分群:电商、银行按消费行为把用户分类,做精准运营。
- 图像处理:把一张图的颜色聚成几种,实现压缩或卡通化。
- 数据探索:面对没标签的新数据,先聚类看看"长几堆",是分析的第一步。
下次看到"用户画像"“智能分类”,背后很可能就是这套"放中心、抢点、挪中心"的简单循环,一遍遍跑出来的。