机器学习实战ByMatlab(4):二分K-means算法

913 查看

前面我们在是实现K-means算法的时候,提到了它本身存在的缺陷:

1.可能收敛到局部最小值
2.在大规模数据集上收敛较慢

对于上一篇博文最后说的,当陷入局部最小值的时候,处理方法就是多运行几次K-means算法,然后选择畸变函数J较小的作为最佳聚类结果。这样的说法显然不能让我们接受,我们追求的应该是一次就能给出接近最优的聚类结果。

其实K-means的缺点的根本原因就是:对K个质心的初始选取比较敏感。质心选取得不好很有可能就会陷入局部最小值。

基于以上情况,有人提出了二分K-means算法来解决这种情况,也就是弱化初始质心的选取对最终聚类效果的影响。

二分K-means算法

在介绍二分K-means算法之前我们先说明一个定义:SSE(Sum of Squared Error),也就是误差平方和,它是用来度量聚类效果的一个指标。其实SSE也就是我们在K-means算法中所说的畸变函数:

SSE计算的就是一个cluster中的每个点到质心的平方差,它可以度量聚类的好坏。显然SSE越小,说明聚类效果越好。

二分K-means算法的主要思想:
首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大程度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目k为止。

二分k均值算法的伪代码如下:

将所有数据点看成一个簇

当簇数目小于k时

对每一个簇

计算总误差

在给定的簇上面进行k-均值聚类(k=2)

计算将该簇一分为二后的总误差

选择使得误差最小的那个簇进行划分操作

Matlab 实现

算法迭代过程如下

biCentSet =

-0.1036   0.0543
0   0
0   0
0   0

第1个cluster被划分后的误差为:792.916857

bestClusterToSpilt =

1

bestCentSet =

-0.2897 -2.8394
0.0825 2.9480

biCentSet =

-0.2897   -2.8394
0.0825   2.9480
0   0
0   0

第1个cluster被划分后的误差为:409.871545
第2个cluster被划分后的误差为:532.999616

bestClusterToSpilt =

1

bestCentSet =

-3.3824   -2.9473
2.8029   -2.7315

biCentSet =

-3.3824   -2.9473
0.0825   2.9480
2.8029   -2.7315
0   0

第1个cluster被划分后的误差为:395.669052
第2个cluster被划分后的误差为:149.954305
第3个cluster被划分后的误差为:393.431098

bestClusterToSpilt =

2

bestCentSet =

2.6265   3.1087
-2.4615   2.7874

biCentSet =

-3.3824   -2.9473
2.6265   3.1087
2.8029   -2.7315
-2.4615   2.7874

最终效果图

运用二分K-means算法进行聚类的时候,不同的初始质心聚类结果还是会稍微有点不同,因为实际上这也只是弱化随机质心对聚类结果的影响而已,并不能消除其影响,不过最终还是能收敛到全局最小。