K-均值聚类(K-means)算法

        聚类算法,是一种无监督的学习方法,他将相似的对象归到统一簇中,簇内的对象越相似,聚类效果也就越好,我们用簇识别表示给出聚类结果的含义。他有点像全自动分类,假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是什么;聚类和分类的最大不同在于,分类的目标事先已知,而聚类则不一样。因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时也被称为无监督学习。

        聚类算法的目的是将相似的对象聚到一起,所以我么就需要一个衡量对象相似度的方法。在机器学习中大多数都是用距离衡量对象之间的相似度的,聚类算法也是用距离来衡量。

  • K-均值聚类算法

        K-均值聚类算法,是从给定的数据集的k个簇。簇个数k是用户给定的,每一个簇通过其质心,即簇中所有点的中心来描述。点与点之间的相似度计算,和KNN算法一样,我们用欧式距离来衡量。也可以用其他自己喜欢的距离度量方法。

        其算法的基本思路及过程如下:

  1. 随机确定k个点作为初始的质心;
  2. 分别计算集合中的点到这k个质心距离,并将每个点归到距离其最近的那个质心所在的簇;如果所有点所属的簇都没发生改变,则到步骤(4)
  3. 分别计算2中生成的k个簇中所有点的均值,并将其作为新的质心。并返回步骤(2)。
  4. 返回所有簇的质心。聚类结束。

        看整个过程其实算法挺简单的,不需要复杂的数据推理什么的。但是这个可能会有一些极端的情况:

                                                       K-均值聚类(K-means)算法_第1张图片

                                                                         图1

        假设我们要对图1中的9个点进行分类,k值为3。如果正好我们初始的点选择的是3,6,9,那么我们最终的结果可能是{1,9,8},{2,3,4},{5,6,7},那这个结果明显就不是我们想要的结果,即质心的初始化导致结果不好,下面是一个更加实际的图:

                          K-均值聚类(K-means)算法_第2张图片

                                                              图2

        如图2所示更加真实化的因为质心初始化问题,导致分类结果不好。所以我们就需要对其做进一步的后处理,从而来提高聚类的性能。

  • 使用后处理来提高聚类的性能

        考虑图2中的情况,我们虽然使算法收敛了,但是分类效果较差,原因是K-均值算法收敛到了局部最小值,而非全局最小值(局部最小值指的是结果还可以,但是并非是最好的结果,全局最小值是可能的最好的结果)。

        我们用SSE(Sum of Squared Error,误差平方和)来衡量聚类的效果。SSE值越小表示数据点越接近于他们的质心,聚类效果越好。在看图2,虽然收敛了,但是每个簇中的点距离中心点的距离是很大的。所以我们需要对聚类后的簇进行后处理,使其更加优化。

        一种方法是将具有最大SSE值的簇划分为两个簇。具体是现实可以将最大簇包含的点过滤出来并在这些点上运行K-均值算法,设置k的值为2。为了保持总簇数不变,我们需要将某两个簇进行合并。参考图2的结果目前是三角是一个簇,圆圈是一个簇,方块是一个簇,从图上我们可以看出得先对三角进行2分,然后可以分为:左侧三角、右侧三角、圆、方块4个簇,接下来需要合并簇,根据合并之后簇SSE最小,我么会把左侧三角和圆合并,剩下右侧三角和方块;还是不理想,明显下来需要把左侧三角和圆组成的簇划分,分成左三角+上面两个圆、下面圆、方块、有三角4个簇,接下来就很容易算出需要将下面圆和方块合并,这样就得到了最终优化结果:三角+上面两个圆、下面圆+方块、右三角3个簇。

        对于上面的合并过程有两个办法:合并最近的质心,或者合并两个是的SSE增幅最小的质心。第一种思路通过计算所有质心之间的距离,然后合并距离最近的两个点来实现。第二种方法,需要合并两个簇然后计算踪SSE值。必须在所有可能的两个簇上重复上述处理过程,直到找到合并最佳的两个簇为止。

  • 二分K-均值算法

        为了克服K-均值算法收敛于局部最小值的问题,有人提出了另一个称为二分K-均值算法,思路特别简单

  1. 从整个集合开始;
  2. 生成一个列表,放的是各个簇信息(例如簇编号,中心点),刚开始所有集合是一个簇;
  3. 计算所有簇的SSE值,并将其加起来作为整体的SSE值;
  4. 遍历所有的簇列表,分别将其2分,计算分后的SSE,和分前的整体的SSE值,找出分后使原来的SSE值减小最大的列表中的簇进行划分为两个簇,此时簇数加1,此时被划分的簇就相当于不存在了,被两个新簇代替,然后更新两个新簇的质心,以及簇列表,还有最大的SSE值;
  5. 如果当前簇数等于我们的目标簇数,结束算法,否则返回步骤(4)。

        注:过程中的2分,就是在对应数据集上运行k为2的K-均值聚类算法,生成两个聚类。

  • 总结

           K-均值聚类算法,就是要将一堆混在一起的数据,相似的分到一块,从而发现每一类所具有的特点和其潜在的价值。当然前提我们可能清楚要分为几类,但是并不知道个个类的具体的一些特征,通过聚类后,找到相似类,就可以更好分析其特征。

你可能感兴趣的:(机器学习,机器学习,K-均值聚类,k-means)