各种聚类算法的集合

Posted 小肉丸子的小当家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各种聚类算法的集合相关的知识,希望对你有一定的参考价值。

哎呦~今天在看机器视觉的书的时候看到了聚类分析哦~~其实我以前悄咪咪的有做过这方面的研究,所以是旧货分享咯~~比较多~边听歌边看吧~

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 各种聚类算法的集合



.概述

   聚类指通过某种算法来把一组未知类别的样本划分成若干类别,这在机器学习中被称作 unsupervised learning (无监督学习)。在商业上常用于发现不同的客户。

传统的聚类算法可以被分为五类:划分方法、层次方法、基于密度方法、基于网格方法和基于模型方法

二.划分方法

1 划分方法(PAM:PArtitioning method) 首先创建k类别k为要创建的类别个数;然后通过不断迭代将对象从一个移到另一个类来改善聚类效果。典型的划分方法包括:

k-meansK均值聚类), k-medoidsk中心聚类),CLARA(Clustering LARge Application),

CLARANS(Clustering Large Application based upon RANdomized Search).

FCM

2.1 k均值聚类

k均值聚类是最常见的聚类算法,首先随机选择k个对象,每个对象代表一个聚类的质心。对于其余的每一个对象,根据该对象与各聚类质心之间的距离,把它分配到与之最相似的聚类中。然后,计算每个聚类的新质心。重复上述过程,直到准则函数会聚。通常采用的准则函数是平方误差准则函数。

K-means聚类算法的具体步骤如下:

1) 从数据集中选择k个质心C1C2Ck作为初始的聚类中心;

2) 把每个对象分配到与之最相似的聚合。每个聚合用其中所有对象的均值来代表,最相似就是指距离最小。对于每个点Vi,找出一个质心Cj,使它们之间的距离d(VjCj)最小,并把Vi分配到第j组;

3) 把所有的点都分配到相应的组之后,重新计算每个组的质心Cj

4) 循环执行第2)步和第3)步,直到数据的划分不再发生变化。

该算法具有很好的可伸缩性,其计算复杂度为O(nkt),其中,t是循环的次数。

K-means聚类算法的不足之处在于它要多次扫描数据库,此外,它只能找出球形的类,而不能发现任意形状的类。还有,初始质心的选择对聚类结果有较大的影响,该算法对噪声很敏感。 

2.2 K—中心点

由于k均值每次要计算聚类中心,由此对离群点比较敏感,当样本中有离群点时,计算出的质心会与实际质心发生偏差。由此为了解决这个问题,学者提出利用一个实际的样本来代表一个簇。

方法:

    1)从所有的样本点中随机选择k个对象作为初始的中心点,记为Oj

    2)将每个剩余的对象分配到最近的中心点所代表的簇

    3)随机的选择一个非中心点点Orandom作为质心

    4)计算用Orandom代替代表对象Oj的总代价S(代价函数就是计算绝对误差值的差)

    6if S<0,那么 Orandom替换Oj,形成新的k中心点的集合

 

    7重复步骤(2)到(6until 分类不发生变化

 

 

编写了一个程序运行后发现,这个算法的复杂度实在是太高了,而且随机挑选非中心点,这个比较不靠谱。用的98*706的数据集作为实验对象,运行速度已经很慢了,那么可想而知数据集很大的时候,非常影响效率。体验不佳。。。不推荐。。。

 

2.3  划分聚类法的改进

 

为了处理大数据集,可以使用CLARA:大型应用聚类,基于抽样的方法,使用数据集的一个随机样本,然后使用PAM方法由样本计算最佳中心点。(可能在随机抽样时错过最佳中心点而永远找不到最佳聚类)

 

CLARANS:基于随机搜索的聚类大型应用,随机选择k个对象作为当前中心点,然后,随机的选择一个当前中心点和一个非当前中心点的对象,若替换以后能够改善绝对误差,则进行替换。进行这种随机搜索l次,l布之后的中心点的集合被看做一个局部最优解,再重复以上随机过程m次,并返回最佳局部最优解作为最终的结果。

  

 

 层次方法(hierarchical method)

章节二介绍的划分方法,都面临着K的个数的选择问题。为了不在这个参数的选取上花费太多时间,可以考虑层次聚类。

凝聚的层次聚类(AGNES算法):一种自底向上的策略,首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇(一般是计算所有簇的中心之间的距离,选取距离最小的两个簇合并),直到某个终结条件被满足或者达到最大迭代次数。

分裂的层次聚类(DIANA算法):采用自顶向下的策略,它首先将所有对象置于一个簇中,然后逐渐细分为越来越小的簇(一般是每次迭代分裂一个簇为两个),直到达到了某个终结条件或者达到最大迭代次数。

3.1 凝聚的层次算法(agglomerative clustering

其中自下而上的方法步骤为:

       1、(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度;

       2、寻找各个类之间最近的两个类,把他们归为一类(这样类的总数就少了一个);

       3、重新计算新生成的这个类与各个旧类之间的相似度;

       4、重复23直到所有样本点都归为一类,结束。

具体的步骤在代码butoom2top.py 中。

 

代码通过二叉数的形式,将每一种类别装成了一棵树,里面的叶子节点存储着的是每一类的原始索引号。

3.1.1 ward聚类

Ward法又称离差平方和法,即以平方欧氏距离作为两类之间的距离,先将集合中每个样本自成一类,在进行类别合并时,计算类重心间方差,将离差平方和增加的幅度最小的两类首先合并,再依次将所有类别逐级合并。

3.1.2 对比两种层次聚类方法

分别是ward average_linkage,两者的分类结果都很令人满意,下面看训练时间。在样本数目为1500的情况下,利用average_linkage的方法更快一些。

ward  used = 0.0920717716217041

average_linkage  used = 0.0776212215423584

 

各种聚类算法的集合


  

3.2 分裂的层次算法(不常用)

 

并经常要与其它聚类方法相结合,如循环定位。典型的这类方法包括:

BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies) 方法,它首先利用树的结构对对象集进行划分;然后再利用其它聚类方法对这些聚类进行优化。

CURE(Clustering Using REprisentatives) 方法,它利用固定数目代表对象来表示相应聚类;然后对各聚类按照指定量(向聚类中心)进行收缩。

ROCK方法,它利用聚类间的连接进行聚类合并。CHEMALOEN方法,它则是在层次聚类时构造动态模型。

 

 

 基于密度的方法

根据密度完成对象的聚类。它根据对象周围的密度(如DBSCAN)不断增长聚类。典型的基于密度方法包括:

DBSCAN(Densit-based Spatial Clustering of Application with Noise):该算法通过不断生长足够高密度区域来进行聚类;它能从含有噪声的空间数据库中发现任意形状的聚类。此方法将一个聚类定义为一组密度连接的点集。

OPTICS(Ordering Points To Identify the Clustering Structure):并不明确产生一个聚类,而是为自动交互的聚类分析计算出一个增强聚类顺序。

4.1 mean Shift 算法

对于Mean Shift算法,是一个迭代的步骤,即先算出当前点的偏移均值,将该点移动到此偏移均值,然后以此为新的起始点,继续移动,直到满足最终的条件。其目的在于找到密度最大的区域,并以该区域的均值作为聚类中心。整个过程可以认为是求概率密度最优解的过程。


从上图可以看出来,聚类中心逐渐朝着高密度方向进行,直到到达密度最大区域的中心。

对多维数据集进行MeanShift聚类过程如下: 

1. 在未被标记的数据点中随机选择一个点作为中心center;

2. 找出离center距离在bandwidth之内的所有点,记做集合M,认为这些点属于簇c。同时,把这些求内点属于这个类的概率加1,这个参数将用于最后步骤的分类

3. center为中心点,计算从center开始到集合M中每个元素的向量,将这些向量相加,得到向量shift。

4. center = center+shift。即center沿着shift的方向移动,移动距离是||shift||。

5. 重复步骤2、3、4,直到shift的大小很小(就是迭代到收敛),记住此时的center。注意,这个迭代过程中遇到的点都应该归类到簇c。

6. 如果收敛时当前簇c的center与其它已经存在的簇c2中心的距离小于阈值,那么把c2和c合并。否则,把c作为新的聚类,增加1类。

7. 重复1、2、3、4、5直到所有的点都被标记访问。

8. 分类:根据每个类,对每个点的访问频率,取访问频率最大的那个类,作为当前点集的所属类。 
简单的说,mean shift就是沿着密度上升的方向寻找同属一个簇的数据点

 

各种聚类算法的集合



4.2 DBSCAN 聚类

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。

DBSCAN算法描述:

输入: 包含n个对象的数据库,半径e,最少数目MinPts;

输出:所有生成的簇,达到密度要求。

DBSCAN方法的方法步骤是:

(1)首先定义邻域,为以某个点为中心,以半径为(eps)的网络

(2)首先寻找所有的核心点,即找出数据集中密度达到阈值的点,具体的方式可以定义邻域内相邻的数据点的个数大于(min_sample)的点为核心点

(3)领域中包含的非核心点,定义为边界点

(4)不是核心点或是边界点的为噪声点

(5)将核心点与其领域的所有核心点放在一个簇放在一个簇中

(6)将核心点领域中的边界点放入同一个簇中

(7)得到若干个簇,每个簇定义为一类。

各种聚类算法的集合


从上面的过程可知,DBSCAN对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数的选择无规律可循,只能靠经验确定。

4.3 对比

参数为

bandwidth = cluster.estimate_bandwidth(X, quantile=0.2)

meanshift= cluster.MeanShift(bandwidth=bandwidth, bin_seeding=True)

dbscan = cluster.DBSCAN(eps=.3)

 

各种聚类算法的集合


可以看出,dbscan的聚类效果主要取决于密度,密度未达标的点称为噪声点,用黑色的点表示,说明该方法非常适合处理异常数据,可以有效避免噪声干扰。当设置eps=.6时,即领域半径增大时,判断的噪声点减少。

Meanshift的分类效果与bandwidth的有关,如果不指定的话,那么默认用sklearn.cluster.estimate_bandwidth来估计参数。当设置 cluster_all=False 时,认为不是所有的点都有类别,会有噪声点(和dbscan类似),噪声点用标签-1,黑色表示。


 基于网格的方法

首先将对象空间划分为有限个单元以构成网格结构;然后利用网格结构完成聚类。

STING(STatistical INformation Grid) 就是一个利用网格单元保存的统计信息进行基于网格聚类的方法。

CLIQUE(Clustering In QUEst)Wave-Cluster 则是一个将基于网格与基于密度相结合的方法。

5.1 AffinityPropagation吸引子传播算法

吸引子传播算法( affinity propagation, AP) 是2007 年由Frey和 Dueck在Science 上提出的一种新的聚类算法. 它的特点是快速、高效, 不必事先指定聚类数目并且能够很好地解决非欧空间问题( 如不满足对称性或者不满足三角不等式) 以及大规模稀疏矩阵计算问题等。因此,它已经被用于人脸识别、基因发现、搜索最优航线、 码书设计以及实物图像识别等领域。

    吸引子传播算法的基本思想是将全部样本看作网络的节点, 然后通过网络中各条边的消息传递,计算出各样本的聚类中心。聚类过程中,共有两种消息在各节点间传递,分别是吸引度( responsibility)和归属度(availability) 。聚类的结果取决于样本间的相似性大小和消息传递。

AP算法通过迭代过程不断更新每一个点的吸引度和归属度值,直到产生m个高质量的聚类中心同时将其余的数据点分配到相应的类中。

 

各种聚类算法的集合



5.2谱聚类算法(Spectral Clustering)

谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的目的。其中的最优是指最优目标函数不同,可以是割边最小分割——如图1Smallest cut(如后文的Min cut), 也可以是分割规模差不多且割边最小的分割——如图1Best cut(如后文的Normalized cut)

1 谱聚类无向图划分——Smallest cutBest cut

这样,谱聚类能够识别任意形状的样本空间且收敛于全局最优解,其基本思想是利用样本数据的相似矩阵(拉普拉斯矩阵)进行特征分解后得到的特征向量进行聚类。

5.3 对比 (神奇的结果hhh)


 

 基于模型的方法

它假设每个聚类的模型并发现适合相应模型的数据。典型的基于模型方法包括:

统计方法COBWEB:是一个常用的且简单的增量式概念聚类方法。它的输入对象是采用符号量(属性-值)对来加以描述的。采用分类树的形式来创建一个层次聚类。

CLASSITCOBWEB的另一个版本.。它可以对连续取值属性进行增量式聚类。它为每个结点中的每个属性保存相应的连续正态分布(均值与方差);并利用一个改进的分类能力描述方法,即不象COBWEB那样计算离散属性(取值)和而是对连续属性求积分。但是CLASSIT方法也存在与COBWEB类似的问题。因此它们都不适合对大数据库进行聚类处理.

 

 发展方向

传统的聚类算法已经比较成功的解决了低维数据的聚类问题。但是由于实际应用中数据的复杂性,在处理许多问题时,现有的算法经常失效,特别是对于高维数据和大型数据的情况。因为传统聚类方法在高维数据集中进行聚类时,主要遇到两个问题。高维数据集中存在大量无关的属性使得在所有维中存在簇的可能性几乎为零;高维空间中数据较低维空间中数据分布要稀疏,其中数据间距离几乎相等是普遍现象,而传统聚类方法是基于距离进行聚类的,因此在高维空间中无法基于距离来构建簇。

高维聚类分析已成为聚类分析的一个重要研究方向。同时高维数据聚类也是聚类技术的难点。随着技术的进步使得数据收集变得越来越容易,导致数据库规模越来越大、复杂性越来越高,如各种类型的贸易交易数据、Web 文档、基因表达数据等,它们的维度(属性)通常可以达到成百上千维,甚至更高。但是,受维度效应的影响,许多在低维数据空间表现良好的聚类方法运用在高维空间上往往无法获得好的聚类效果。高维数据聚类分析是聚类分析中一个非常活跃的领域,同时它也是一个具有挑战性的工作。高维数据聚类分析在市场分析、信息安全、金融、娱乐、反恐等方面都有很广泛的应用。


以上是关于各种聚类算法的集合的主要内容,如果未能解决你的问题,请参考以下文章

数据科学家之路——了解一下聚类算法

聚类算法 - kmeans

ML: 聚类算法R包-模糊聚类

K均值聚类算法

谱聚类算法

初探DBSCAN聚类算法