K-means聚类算法

来源:互联网 发布:淘宝优惠券如何领取 编辑:程序博客网 时间:2024/06/05 09:53

        最近我正在学习Stanford公开课Andrew Ng老师讲的Machine Learning(ML)课程,受益匪浅。下面附上视频教程以及课后作业的链接:https://class.coursera.org/ml/class/index这几天对K-means聚类算法进行了学习,并在此做一个小结,第一是希望以后能养成及时总结的好习惯,第二是想能给和我一样刚刚入门机器学习的同行人(小伙伴们)一点点启迪和帮助,共同进步。

--------------------------------------话不多说,进入正题-------------------------------------------------------

        K-means算法属于非监督学习(Unsupervised Learning)的范畴。所谓非监督学习,简单来说就是给的数据集没有标签y(监督学习就是给的数据集有标签y),还有PCA、一些deep learning也属于非监督学习。K-means的算法如下图所示:


K-means算法有两个核心的部分:

1 cluster assignment,也就是上图的第一个for循环的内容,它的作用是分别计算数据集中的点x(i)(共m个数据点)与所有种子点(共K个)的欧氏距离,若与第k个种子点的欧氏距离最小则x(i)被分为第k类,即c(i)=k;

2 move centroids,也就是上图第二个for循环的内容,它的作用是聚完类后计算某类中所有数据点的平均值,并把种子点移到这个平均值对应的位置上成为新的中心点;

重复上面两个步骤直到最大迭代次数。

        和监督学习一样,K-means算法也可以计算代价函数,即cost function J(distortion function)。


它主要有两个作用:

1 观察算法是否工作正常。代价函数J的变量有两大类:c(1)...c(m)和u1...uK。当执行第一个for循环的时候需要固定u1...uK,改变c(1)...c(m)使得J的值降低;当执行第二个for循环的时候需要固定c(1)...c(m)改变u1...uK的值。和监督学习不同,由于没有收到学习率这一参数的影响,J值会持续下降(监督学习的学习率如果设置的过大可能会使得J上升);如果出现有上升的情况,说明代码出现了bug,所以可以用来观察算法是否工作正常。

2 避免局部最优(help avoid local optima)。我们一般从数据点中随机选取种子点。由于随机初始化种子点不同会使得最终的收敛结果不同,导致得不到最好的收敛结果,代价函数J可以帮助避免局部最优。具体方法如下:

我们采用一种叫Multiple random initialization的方法,就是多次随机初始化种子点来进行聚类算法(一般50-1000次),收敛后计算代价函数J找到最小值即被认作是全局最优解。但是这种方法只对K=2-10有效果,当K值较大时效果不是很明显。

       K-means聚类算法简单快速,时间复杂度近于线性——O(mKt)——其中m代表数据点的个数,K代表聚类的种类,t代表迭代的次数,适合挖掘大规模数据集。但是缺点也同样明显:

1 K值是事先选定的,实际中有时候会难以估计。有一个简单的方法叫Elbow-method,就是画出K值与代价函数J所对应的曲线,找出elbow点对应的K值;还有就是根据实际需求和经验来确定K值,如衣服的尺码等。

2 当数据量非常大时算法的时间开销会非常大。

3 随机初始化种子点会对聚类结果有较大影响。有一种优化方案是K-means++算法,它的核心思想其实就是让种子点的距离尽可能的远。下面附上算法介绍的链接:http://blog.csdn.net/b_h_l/article/details/12751675

----------------------------------------下面是课后作业的代码,如有错误欢迎指出--------------------------------



上面两个图是核心部分两个for循环对应的代码,下图是k-means++的源码(注意载入数据时与上面不同,上面的X矩阵的行向量是数据的特征,这里x矩阵列向量是数据的特征)


1 0
原创粉丝点击