聚类方法之k-mean算法

来源:互联网 发布:乐高ev3编程视频教程 编辑:程序博客网 时间:2024/05/16 13:02

算法思想:

K-mean算法又称K均值算法,属于原型聚类中的一种基于距离度量的聚类算法。其思想是:

1.随机选取数据集中的k个初始点作为质心,遍历整个数据集,对于每个样本,将其归类到距离其最近的质心所对应的簇。
2.接着计算每个簇的均值,作为当前簇的质心,重新步骤1的操作,直至迭代结束或簇均值的调整幅度小于指定的阈值。

算法流程图如下:
这里写图片描述

按照西瓜书上的迭代过程,如下图所示:

这里写图片描述

从图中可看出,由于选取点的随机性,第一轮迭代后的效果并不理想,但经过多轮迭代簇质心的改变,聚类效果明显好了很多。

算法改进:

由于k值是用户预先设定的一个参数,存在着太多的随机性,将k值设定太低,则无法表现出样本之间的差异,但如果把k值设定太高,则会“夸大”样本间的差异性。那么,怎么评判k值的选择是否合理,或者说,如何来评价聚类的效果呢?

我们可以用误差平方和(SSE:sum of square error)来评价聚类的效果
误差平方和表示的是簇中所有样本点到其质心距离平方和,误差平方和越小,表示数据点越接近于其质心,聚类效果也越好。

通过最小化误差平方和的评价思想,我们有两条思路来优化K-mean算法。
1.增加簇(k)的个数
2.先将数据集分为m个簇(m小于k),然后将m个簇中较大的簇分为几个小簇,直到簇值个数为k

显然,第一种方法有为我们的聚类目标,这里,主要讲述第二种方法中比较具有代表性的方法—二分K均值算法。

二分k均值算法的主要思想是:
1.设定聚类目标—簇的个数k
2.将所有点看成一个簇,此时簇的个数m=1
3.while m < k :
for 每一个簇 i:
计算总误差i.SSE1
在给定的簇上进行K均值聚类(k=2)
计算一分为二的簇的总误差i.SSE2
选择误差最小min(i.SSE2)的簇进行k均值聚类(k=2)

借用《机器学习实战》的效果图,二分K均值的效果图如下:
这里写图片描述

二分K均值算法总能产生较好的聚类结果。

总结:

优点:

简单易懂,容易实现

缺点:

1.k值的选择比较盲目,一般根据实际情况来选择
2.在大规模数据上算法收敛过慢,且可能收敛到局部最小而不是全局最小。

参考

周志华:《机器学习》

Peter Harrington (作者) 李锐 , 李鹏 , 曲亚东 , 王斌 (译):《机器学习实战》