1. Kmeans算法简介
Kmeans算是非常经典的一个聚类算法了,早已经被写到教科书里面了,不过很不幸的是,最近干活遇到了这个,然后我发现我已经忘得差不多一干二净了……
所以这里就过来挖个坟,考个古,把这玩意拉出来复习一下。
如前所述,Kmeans算法是一个聚类算法,具体来说,我们输入一个包含 N N N个点的点集,我们的目的是要将这 N N N个点分为 K K K个簇,使得每个点到各自的簇的中心距离之和最小。
用公式来表达的话就是:
s = ∑ i = 1 N m i n j ∈ { 1 , . . . , K } ( d ( x i , u j ) ) s = \sum_{i=1}^{N} \mathop{min}\limits_{j \in \{1, ..., K\}}(d(x_i, u_j)) s=i=1∑Nj∈{ 1,...,K}min(d(xi,uj))
要找到一组 u j u_j uj使得 s s s最大。
其中, d ( x , y ) d(x, y) d(x,y)表示 x , y x,y x,y两点间的距离,一般我们在这里使用欧氏距离。
2. Kmeans算法细节
Kmeans算法的核心思路是迭代。
首先,我们随机从 N N N个点当中选出 K K K个点作为簇的中心点。
然后,根据全部的 N N N个点到这 K K K个中心点之间的距离,我们就可以将这全部的 N N N个点进行分类,分配到这 K K K个簇当中。
而后,我们更新这 K K K个簇的中心,具体来说,我们取这 K K K个点的均值点作为这 K K K个簇的新的中心。
我们不断地重复上述两个步骤,直到达到迭代上限或者簇的中心点不再发生变化即可。
具体的,我们可以给出上述Kmeans算法的算法整理如下:
- step 1: 从 N N N个给定点当中随机 K K K个点作为 K K K个簇的中心点;
- step 2: 计算每一个点到这 K K K个簇的中心点之间的欧式距离,将其分配到最小的那个簇当中,从而对所有的点进行聚类;
- step 3: 对于2中得到的每一个簇,更新其中心点为所有点的均值,即 u = ∑ i x i n \bold{u} = \frac{\sum_i \bold{x}_i}{n} u=n∑ixi;
- step 4: 重复上述2-3两步,直到迭代次数达到上限或者簇的中心不再发生变化。
而Kmeans的算法的优缺点因此也就比较明显:
- 优点
- 易实现,易debug
- 缺点
- 迭代非常耗时,对于大数据量尤其明显;
- 较依赖于初始化中心的选择,不同初始化中心点的选择会带来较大的结果差异;
3. Kmeans算法收敛性证明
现在,给出了kmeans聚类算法之后,我们来考察一下kmeans算法的收敛性,也就是说,为什么kmeans算法的迭代是有效的。
我们使用原始的kmeans算法进行说明,即是说,使用欧式距离来对两点间的距离进行描述,此时,前述提到的loss函数就可以表达为:
s = ∑ i = 1 N m i n j ∈ { 1 , . . . , K } ∣ ∣ x i , u j ∣ ∣ s = \sum_{i=1}^{N} \mathop{min}\limits_{j \in \{1, ..., K\}} ||x_i, u_j|| s=i=1∑Nj∈{ 1,...,K}min∣∣xi,uj∣∣
具体到第 k k k次迭代上,即有:
s k = ∑ i = 1 N m i n j ∣ ∣ x i , u j k ∣ ∣ s^{k} = \sum_{i=1}^{N} \mathop{min}\limits_{j} ||x_i, u_j^k|| sk=i=1∑Njmin∣∣xi,ujk∣∣
显然, s k s^{k} s

本文回顾了K-means算法的基本原理,包括其迭代过程、收敛性证明,介绍了cosine和点积距离版本的变体,并提供了基于sklearn和自定义实现的代码实例。涵盖了算法核心、优化与扩展以及实际应用。
最低0.47元/天 解锁文章
956

被折叠的 条评论
为什么被折叠?



