# 聚类算法

人类本身就具备这种归纳和总结的能力，能够把类似的事物放到一起作为一类事物识别，尽管它们之间还是有细微差别，但是我们心里有一个“差异距离”。
只要在这个差异距离内，特征稍有区别无关大碍，它们仍然还是这一类事物，超过这个“差异距离”我们就会当做另外一个事物。
例如下面这个图中的点，我们可能一眼就能看出来，这个点是可以分成两堆的。但是计算机怎么能学会把这些点分成两堆呢？

![待聚类的数据](img/data-thinking/聚类1.png)

这里我给你讲一个最常见的聚类算法 K-Means，具体实现方法我称作“选大哥”。

### 第 1 步，我随意挑两个点，作为开始的大哥。

![第1步](img/data-thinking/聚类2.png)

### 第 2 步，“拉帮结派”

算每一个点和大哥的距离，这些点里谁离哪个大哥更近，我们就给它归到这个大哥的团伙里去。

![第2步](img/data-thinking/聚类3.png)

### 第 3 步，我们开“帮派大会”重新选大哥

每个大哥的团队里小弟，都算一下这个团队里面最中心点在哪里（也就是 X 坐标和 Y 坐标的平均值），离中心点最近的那个点成为新大哥。

![第3步](img/data-thinking/聚类4.png)

### 第 4 步，重新回到第 2 步，根据帮派选出来的新大哥再去分自己的小队伍。

![第4步](img/data-thinking/聚类5.png)

这样重复下去，直到最后这个帮派稳定下来，那我们就能看到这些群组的点到底应该怎样区分了。

总结一下，K-Means“选大哥”算法，就是先把一群点分成 K 类，根据 K 类中间均值的距离去选择（Means 就是均值）到底它属于哪一个聚类。
最终当聚类稳定下来的时候，聚类也就完成了。

可能你会问，刚才这个例子里，我们怎么知道一开始我应该分成两类呢？这其实就是业务专家和个人的经验选择了。你拿到这些数据的时候，背后业务逻辑可能会告诉你大概率要选择几类。
或者你可以多尝试几次，聚成几类更容易来解释你的业务，你就可以最后聚成几类。

可能你还会问，从第 4 步回到第 2 步的过程中，我们会不会陷入死循环，一直在第 2 步和第 3 步当中选大哥找小弟，永远选不出来最后的结果呢？
放心，有[数学证明](https://zhuanlan.zhihu.com/p/149597282) ，我们的这种方法一定会收敛出结果。

还有一个问题，图上表示的这些点可以看得很明白，但实际工作过程当中很多事情很难表示成点和点之间的距离。例如用户群的划分，这怎么来计算呢？
简单来讲，在算法的世界里，我们可以有各种方法把人和人之间的属性和行为的差异数字化，
然后把它们算成“欧几里得距离”或者“余弦相似度”，
你现在只需要理解，**最终任何事物的特征属性都可以变成类似距离的东西来计算**就可以了。

## 参考资料

- [《数据分析思维课》14 | 初识聚类算法：物以类聚，让复杂事物简单化](https://time.geekbang.org/column/article/412828)
