定义
K-Means算法是一种无监督学习的聚类算法,它实现起来简单,聚类效果好,因此应用很广泛。所谓无监督学习就是仅有数据,没有数据标签,算法自己发现数据的规律(模式),简单而言,就是把相似的物体聚在一起。
应用场景
- 图像分割:把图像分成相似的区域
- 用户分层:把拥有类似兴趣的用户聚在一起
K-means算法
- 初始化:随机选择K个点,作为初始中心点,每个点代表一个group.
- 交替更新:
1. 计算每个点到所有中心点的距离,把最近的距离记录下来并赋把group赋给当前的点
2. 针对于每一个group里的点,计算其平均并作为这个group的新的中心点。
K-means算法的一些特性
每一次迭代的复杂度:
计算每个点到所有中心点的距离,把最近的距离记录下来并赋把group赋给当前的点O(Kn)
针对每一个group里的点,计算其平均并作为这个group的新的中心点O(n)
关于K-means的几个问题
- 一定会收敛吗?是,使用EM算法,每次迭代的结果均要比前一次效果好;
- 不同的初始化结果,会不会带来不一样的结果?是,初始化不同,结果不同;因为K-means的目标函数的是非凸函数,使用的是EM算法,单次初始化得到的为局部最优解
- K-means的目标函数是什么? f = min ∑ i = 1 n ∑ x ∈ C i dist ( c i , x ) 2 f=\min \sum_{i=1}^{n} \sum_{x \in C_{i}} \operatorname{dist}\left(c_{i}, x\right)^{2} f=min∑i=1n∑x∈Cidist(ci,x)2
- K值如何选择?手肘法:the Elbow Sum-of-Squares Method
关于the Elbow Sum-of-Squares Method
其概念是基于 SSE(sum of the squared errors,误差平方和)作为指标,去计算每一个群中的每一个点,到群中心的距离。算法如下:
假设总共有 K 个群, Ci 代表其中一个群,mi 表示该群的中心点。
根据 K 与 SSE 作图,可以从中观察到使 SSE 的下降幅度由「快速转为平缓」的点,一般称这个点为拐点(Inflection point),我们会将他挑选为 K。因为该点可以确保 K 值由小逐渐递增时的一个集群效益,因此适合作为分群的标准。
K-means++
K-means++是K-means的初始化优化版本:
- 原始K-means算法最开始随机选取数据集中K个点作为聚类中心,
- 而K-means++按照如下的思想选取K个聚类中心:
假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。
在选取第一个聚类中心(n=1)时同样通过随机的方法。可以说这也符合我们的直觉:聚类中心当然是互相离得越远越好。这个改进虽然直观简单,但是却非常得有效。
代码示例
链接:https://github.com/JackUCASer/K-means
参考
[1]. 贪心科技-机器学习特训营课程
[2]. K-means与K-means++