05 聚类算法 - K-Means、二分K-Means、K-Means 、K-Means||、Canopy、Mini Batch K-Means算法

K-Means 系列:K-Means,二分K-Means,K-Means++,K-Meansll,canopy算法,MiniBatchK-Means算法。

K-Means系列聚类算法原理: https://www.cnblogs.com/pinard/p/6164214.html

用scikit-learn学习K-Means聚类https://www.cnblogs.com/pinard/p/6169370.html

  • 一个是传统的K-Means算法,对应的类是KMeans。
  • 另一个是基于采样的Mini Batch K-Means算法

一、传统K-Means算法

1. 步骤

2. 优缺点

二、K-Means算法衍生

1、二分k-means算法

  二分k-means算法是分层聚类(Hierarchical clustering)的一种,分层聚类是聚类分析中常用的方法。
分层聚类的策略一般有两种:

  • 聚合。这是一种自底向上的方法,每一个观察者初始化本身为一类,然后两两结合
  • 分裂。这是一种自顶向下的方法,所有观察者初始化为一类,然后递归地分裂它们

  二分k-means算法是分裂法的一种。

(1)优点:

    二分k-means算法是k-means算法的改进算法,解决K-Means算法对初始簇心比较敏感的问题,二分K-Means算法是一种弱化初始质心的一种算法,相比k-means算法,它有如下优点:

  • 二分k-means算法可以加速k-means算法的执行速度,因为它的相似度计算少了???
  • 能够克服k-means收敛于局部最小的缺点

(2)思路步骤:

  • 将所有样本数据作为一个簇放到一个队列中。
  • 从队列中选择一个簇进行K-means算法划分,划分为两个子簇,并将子簇添加到队列中。
  • 循环迭代第二步操作,直到中止条件达到(聚簇数量、最小平方误差、迭代次数等)。
  • 队列中的簇就是最终的分类簇集合。

从队列中选择划分聚簇的规则一般有两种方式;分别如下:

  • 对所有簇计算误差和SSE(SSE也可以认为是距离函数的一种变种),选择SSE最大的聚簇进行划分操作(优选这种策略)。
  • 选择样本数据量最多的簇进行划分操作:

  以上过程隐含着一个原则是:因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于它们的质心,聚类效果就越好。
所以我们就需要对误差平方和最大的簇进行再一次的划分,因为误差平方和越大,表示该簇聚类越不好,越有可能是多个簇被当成一个簇了,所以我们首先需要对这个簇进行划分。

(3) 二分k-means的源码分析

参考: https://blog.csdn.net/BaiHuaXiu123/article/details/54883099

           https://www.jianshu.com/p/f0727880c9c0

2、K-Means++算法

解决K-Means算法对初始簇心比较敏感的问题,K-Means++算法和K-Means算法的区别主要在于初始的K个中心点的选择方面,K-Means算法使用随机给定的方式,K-Means++算法采用下列步骤给定K个初始质点:

1、从数据集中任选一个节点作为第一个聚类中心。
2、对数据集中的每个点x,计算x到所有已有聚类中心点的距离和D(X),基于D(X)采用线性概率选择出下一个聚类中心点(距离较远的一个点成为新增的一个聚类中心点)。
3、重复步骤2直到找到k个聚类中心点。

缺点:由于聚类中心点选择过程中的内在有序性,在扩展方面存在着性能方面的问题(第k个聚类中心点的选择依赖前k-1个聚类中心点的值)

另一种选择簇中心的方法:  https://www.cnblogs.com/pinard/p/6164214.html

       虽然k-means++算法可以确定地初始化聚类中心,但是从可扩展性来看,它存在一个缺点,那就是它内在的有序性特性:得到 k 个聚类中心必须遍历数据集 k 次,下一个中心点的选择依赖于已经选择的中心点。 针对这种缺陷,k-means||算法提供了解决方法。

3、K-Means||算法 ()

解决K-Means++算法缺点而产生的一种算法;主要思路是改变每次遍历时候的取样规则,并非按照K-Means++算法每次遍历只获取一个样本,而是每次获取K个样本,重复该取样操作O(logn)次(n是样本的个数),然后再将这些抽样出来的样本聚类出K个点,最后使用这K个点作为K-Means算法的初始聚簇中心点。实践证明:一般5次重复采用就可以保证一个比较好的聚簇中心点。

梳理步骤:

  • 1、在N个样本中抽K个样本,一共抽logn次,形成一个新的样本集,一共有Klogn个数据。
  • 2、在新数据集中使用K-Means算法,找到K个聚簇中心。
  • 3、把这K个聚簇中心放到最初的样本集中,作为初始聚簇中心。
  • 4、原数据集根据上述初始聚簇中心,再用K-Means算法计算出最终的聚簇。

4、Canopy算法

(1)步骤:Canopy算法属于一种“粗”聚类算法,执行速度较快,但精度较低,算法执行步骤如下:

  • 1、给定样本列表L=x1,x,2...,xm以及先验值r1和r2(r1>r2);(先验值 - 自己猜的,人为定义的值)
  • 2、从列表L中获取一个节点P,计算P到所有聚簇中心点的距离(如果不存在聚簇中心,那么此时点P形成一个新的聚簇),并选择出最小距离D(P,aj);
  • 3、如果距离D小于r1,表示该节点属于该聚簇,添加到该聚簇列表中。
  • 4、如果距离D小于r2,表示该节点不仅仅属于该聚簇,还表示和当前聚簇中心点非常近,所以将该聚簇的中心点设置为P,并将P从列表L中删除。
  • 5、如果距离D大于r1,那么节点P形成一个新的聚簇。
  • 6、直到列表L中的元素数据不再有变化或者元素数量为0的时候,结束循环操作。

   Canopy算法得到的最终结果的值,聚簇之间是可能存在重叠的,但是不会存在某个对象不属于任何聚簇的情况。

(2)Canopy算法常用应用场景:

由于K-Means算法存在初始聚簇中心点敏感的问题,常用使用Canopy+K-Means算法混合形式进行模型构建。
1、先使用canopy算法进行“粗”聚类得到K个聚类中心点。
2、K-Means算法使用Canopy算法得到的K个聚类中心点作为初始中心点,进行“细”聚类。

(3)优缺点:
1、执行速度快(先进行了一次聚簇中心点选择的预处理);
2、不需要给定K值,应用场景多。
3、能够缓解K-Means算法对于初始聚类中心点敏感的问题。

5、Mini Batch K-Means

Mini Batch K-Means算法是K-Means算法的一种优化变种,采用小规模的数据子集(每次训练使用的数据集是在训练算法的时候随机抽取的数据子集)减少计算时间,同时试图优化目标函数;Mini Batch K-Means算法可以减少K-Means算法的收敛时间,而且产生的结果效果只是略差于标准K-Means算法。

算法步骤如下:
1、首先抽取部分数据集,使用K-Means算法构建出K个聚簇点的模型。
2、继续抽取训练数据集中的部分数据集样本数据,并将其添加到模型中,分配给距离最近的聚簇中心点。
3、更新聚簇的中心点值。
4、循环迭代第二步和第三步操作,直到中心点稳定或者达到迭代次数,停止计算操作。

参考: https://blog.csdn.net/weixin_33726318/article/details/89588860


 

发布了118 篇原创文章 · 获赞 132 · 访问量 60万+

猜你喜欢

转载自blog.csdn.net/qfikh/article/details/102704025