博客园  :: 首页  :: 联系 :: 管理

ML: 聚类算法-概论

Posted on 2017-08-08 06:00  天戈朱  阅读(1633)  评论(0编辑  收藏  举报

 

       聚类分析是一种重要的人类行为,早在孩提时代,一个人就通过不断改进下意识中的聚类模式来学会如何区分猫狗、动物植物。目前在许多领域都得到了广泛的研究和成功的应用,如用于模式识别、数据分析、图像处理、市场研究、客户分割、Web文档分类等。 聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同数据尽量分离。一个好的聚类方法将产生如下的聚类 :1)、最大化类中的相似性。 2)、最小化类间的相似性。

     所谓聚类问题技术术语解释:就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高。其中每个子集叫做一个簇(cluster)。翻译为人类语言是这样的:有一堆人,每个人的胸牌上都写着“性别:男/女;年龄:XX”,我们可以根据性别把这堆人分为男、女两个子集,或者根据年龄把他们分为老、中、青、少四个子集。

    乍一看,这不还是在做分类操作吗?聚类(clustering)与分类(classification)的不同之处在于:

  • 分类是一种示例式的有监督学习算法它要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应,很多时候这个条件是不成立的,尤其是面对海量数据的时候;
  • 聚类是一种观察式的无监督学习算法,在聚类之前可以不知道类别甚至不给定类别数量,由算法通过对样本数据的特征进行观察,然后进行相似度或相异度的分析,从而达到“物以类聚”的目的。

 聚类算法的分类 


      目前,有大量的聚类算法。而对于具体应用,聚类算法的选择取决于数据的类型、聚类的目的。如果聚类分析被用作描述或探查的工具,可以对同样的数据尝试多种算法,以发现数据可能揭示的结果。
   主要的聚类算法可以划分为如下几类:

  • 基于划分的方法: 如:k-means(K-均值聚类)、k-medoids(K-中心点聚类)、CLARANS
  • 基于层次的方法: 如:BIRCH、CURE、变色龙
  • 基于密度的方法: 如:DBSCAN,OPTICS,DENCLUE,WaveCluster
  • 基于网格的方法: 如:STING,CLIQUE,WaveCluster
  • 基于模型的方法: 如:统计学方法:COBWEB、GMM(Gaussian Mixture Model) 神经网络算法有SOM(Self Organized Maps)   

       聚类问题的研究不仅仅局限于上述的硬聚类(即每一个数据只能被归为一类),模糊聚类 也是聚类分析中研究较为广泛的一个分支。模糊聚类通过隶属函数来确定每个数据隶属于各个簇的程度,而不是将一个数据对象硬性地归类到某一簇中。目前已有很多关于模糊聚类的算法被提出,如著名的FCM算法等。

       详细可供参考算法列表如下:

       

       

      

     

     

     

 

基于划分的聚类算法 


   k-means(K均值算法)是划分方法中较经典的聚类算法之一。由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。目前,许多算法均围绕着该算法进行扩展和改进。
 k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。k-means算法的处理过程如下:首先,随机地 选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。 这个过程不断重复,直到准则函数收敛。使用K-Means算法进行聚类,过程非常直观,如下图示意

  • (a) 给定集合D,有n个样本点
  • (b) 随机指定两个点,作为两个子集的质心
  • (c) 根据样本点与两个质心的距离远近,将每个样本点划归最近质心所在的子集
  • (d) 对两个子集重新计算质心
  • (e) 根据新的质心,重复操作(c)
  • (f) 重复操作(d)和(e),直至结果足够收敛或者不再变化

      k-means 存在的问题:K-means由于简单有效被大量的用于数据预处理、数据分析等。在K-means被实际应用的过程中,大家也逐渐发现它本身存在很多的问题。其中每个问题都有作者分析,并尝试提出解决办法,如:

  • 计算量大 【Re:  KD树加速K-means
  • 聚类数量K需要提前设定,并影响聚类效果     【Re:  各种估计K的方法
  • 聚类中心需要人为初始化,并影响聚类效果    【Re:  K-means++方法
  • 异常点的存在,会影响聚类效果    【Re:  数据预处理】
  • 只能收敛到局部最优   【Re:  未知】

     类别数量估计: 估计类别数量,现在还没有很通用的方法。介绍常见的估计类别数量的一些方式:

  • 数据的先验知识,或者数据进行简单分析能得到
  • 基于变化的算法:即定义一个函数,随着K的改变,认为在正确的K时会产生极值。如Gap Statistic、Jump Statistic
  • 基于结构的算法:即比较类内距离、类间距离以确定K。这个也是最常用的办法,如使用平均轮廓系数,越趋近1聚类效果越好;如计算类内距离/类间距离,值越小越好等
  • 基于一致性矩阵的算法:即认为在正确的K时,不同次聚类的结果会更加相似,以此确定K。
  • 基于层次聚类:即基于合并或分裂的思想,在一定情况下停止获得K。
  • 基于采样的算法:即对样本采样,分别做聚类;根据这些结果的相似性确定K。如,将样本分为训练与测试样本;对训练样本训练分类器,用于预测测试样本类别,并与聚类的类别比较。

    初始化聚类中心: 对于初始化聚类中心的方法。需要说明的是,在任何场景下都合适的方法是不存在的。理想情况应该是针对数据的特点,挑选或设计出适合的方法。

  • K-means++已经被证明是一种简单、好用的方法。
  • 先计算整体样本中心,然后根据样本点到中心的距离,由近至远均匀采样作为初试聚类中心。计算出每个点的”密度“,认为”密度“较大的是聚类中心。先把”密度“最大的挑出作为第一个聚类中心,从剩下的点中找出密度最大,且离所有已有聚类中心大于一定距离的点作为下一个聚类中心,直到选择了K个
  • 计算整体均值,作为第一个聚类中心。从剩下的点中顺序寻找,当遇到离所有已有聚类中心大于一定距离的点,则作为下一个聚类中心,直到选择了K个

  基于层次的聚类算法 


        尽管基于划分的聚类算法能够实现把数据集划分成指定数量的簇,但是在某些情况下,需要把数据集划分成不同层上的簇:比如,作为一家公司的人力资源部经理,你可以把所有的雇员组织成较大的簇,如主管、经理和职员;然后你可以进一步划分为较小的簇,例如,职员簇可以进一步划分为子簇:高级职员,一般职员和实习人员。所有的这些簇形成了层次结构,可以很容易地对各层次上的数据进行汇总或者特征化。

       基于层次的聚类算法(Hierarchical Clustering)可以是凝聚的(Agglomerative)或者分裂的(Divisive),取决于层次的划分是“自底向上”还是“自顶向下”。

  • 自顶向下: 它把所有对象聚于一个簇中开始,该簇是层次结构的根。然后,它把根上的簇划分为多个较小的子簇,并且递归地把这次簇划分成更小的簇,直到满足终止条件。常见的自顶向下的算法有K-means层次聚类算法
  • 自底向上:把数据集中的每个对象最为一个簇开始,迭代地把簇合并成为更大的簇,直到最终形成一个大簇,或者满足某个终止条件。基于自底向上算法有凝聚算法、BIRCH算法、CURE算法、变色龙算法等。

自顶向下层次聚类算法(Divisive):Hierarchical K-means算法


       用到了基于划分的聚类算法那K-means,算法思路如下:

  • 首先,把原始数据集放到一个簇C,这个簇形成了层次结构的最顶层;
  • 使用K-means算法把簇C划分成指定的K个子簇C_i,i = 1,2,…,k,形成一个新的层;
  • 对于步骤2所生成的K个簇,递归使用K-means算法划分成更小的子簇,直到每个簇不能再划分(只包含一个数据对象)或者满足设定的终止条件。

       如下图,展示了一组数据进行了二次K-means算法的过程

      

  Hierarchical K-means算法一个很大的问题是: 一旦两个点在最开始被划分到了不同的簇,即使这两个点距离很近,在后面的过程中也不会被聚类到一起。

   对于以上的例子,红色椭圆框中的对象聚类成一个簇可能是更优的聚类结果,但是由于橙色对象和绿色对象在第一次K-means就被划分到不同的簇,之后也不再可能被聚类到同一个簇。

 自底向上算法:Agglomerative Clustering算法   


      相比于Hierarchical K-means算法存在的问题,Agglomerative Clustering算法能够保证距离近的对象能够被聚类到一个簇中,该算法采用的“自底向上”聚类的思路。算法思路,对于数据集D,D={x_1,x_2,…,x_n}:

  1. 将数据集中的每个对象生成一个簇,得到簇列表C,C={c_1,c_2,…,c_n},其中每个簇只包含一个数据对象:c_i={x_i};
  2. 重复如下步骤,直到C中只有一个簇:
  • a) 从C中的簇中找到两个“距离”最近的两个簇:min⁡【D(c_i,c_j)】;
  • b) 合并簇c_i和cj,形成新的簇c(i+j);
  • c) 从C中删除簇c_i和cj,添加簇c(i+j)

    簇间距离计算:在上面描述的算法中涉及到计算两个簇之间的距离,对于簇C_1和C_2,计算其距离时有以下几种计算方式:

  • 单连锁(Single link): 两个簇之间最近的两个点的距离作为簇之间的距离,该方式的缺陷是受噪点影响大,容易产生长条状的簇。

            

  • 全连锁(Complete link):两个簇之间最远的两个点的距离作为簇之间的距离,采用该距离计算方式得到的聚类比较紧凑。

         

  • 平均连锁(Average link):两个簇之间两两点之间距离的平均值,该方式可以有效地排除噪点的影响。

         

基于密度的聚类方法 


        基于密度的方法(Density-based methods):k-means解决不了不规则形状的聚类。于是就有了Density-based methods来系统解决这个问题。该方法同时也对噪声数据的处理比较好。基于密度聚类的思想:思路就是定一个距离半径,最少有多少个点,然后把可以到达的点都连起来,判定为同类。其原理简单说画圈儿,其中要定义两个参数,一个是圈儿的最大半径,一个是一个圈儿里最少应容纳几个点。最后在一个圈里的,就是一个类。DBSCAN(Density-Based Spatial Clustering ofApplications with Noise)就是其中的典型,可惜参数设置也是个问题,对这两个参数的设置非常敏感。DBSCAN的扩展叫OPTICS(OrderingPoints To Identify Clustering Structure)通过优先对高密度(high density)进行搜索,然后根据高密度的特点设置参数,改善了DBSCAN的不足

     基于密度的聚类方法以数据集在空间分布上的稠密程度为依据进行聚类,无需预先设定族的数据,因此特别适合对于未知内容的数据集进行聚类。其代表算法有:DBSCAN、OPTICS、DENCLUE。

DBSCAN的概念 


    dbscan基于密度,对于集中区域效果较好,为了发现任意形状的簇,这类方法将簇看做是数据空间中被低密度区域分割开的稠密对象区域;一种基于高密度连通区域的基于密度的聚类方法,该算法将具有足够高密度的区域划分为簇,并在具有噪声的空间数据中发现任意形状的簇。

    参数定义:

  • Eps: 邻域的最大半径
  • MinPts: 在Eps-邻域中的最少点数

   根据数据点密度分类:

  • 说明:密度指制定半径(Eps)内点的个数
  • 核心点:该点在邻域内的密度超过给定的阀值MinPs。
  • 边界点:该点不是核心点,但是其邻域内包含至少一个核心点。
  • 噪音点:不是核心点,也不是边界点。

    DBSCAN中的几个定义:

  • Ε邻域:给定对象半径为Ε内的区域称为该对象的Ε邻域;简单来讲就是与点的距离小于等于Eps的所有的点的集合,可以表示为 
  • 核心对象:如果给定对象Ε领域内的样本点数大于等于MinPts,则称该对象为核心对象;
  • 直接密度可达:对于样本集合D,如果样本点q在p的Eps领域内,并且p为核心对象,那么对象q从对象p直接密度可达;
  • 密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p= p1,q= pn,假如对象pi从pi-1直接密度可达,那么对象q从对象p密度可达。注意:密度可达是单向的,密度可达即可容纳同一类。 有点复杂,看图例

           

  • 密度相连:存在样本集合D中的一点o,如果对象o到对象p和对象q都是密度可达的,那么p和q密度相联。如下示例

            

  • 密度可达是直接密度可达的传递闭包,并且这种关系是非对称的。密度相连是对称关系。DBSCAN目的是找到密度相连对象的最大集合

       由一个核心对象和其密度可达的所有对象构成一个集类,如下示例 : 假设 Eps = 3, MinPts = 3

  • 点P的E领域中有点{m,p,p1,p2,o}, m的E领域中有点 {m,q,p,m1,m2}, q的E领域中有点{q,m}, o的E邻域中有点{o,p,s},  点s的E邻域中有点{o,s,s1}
  • 则核心对象有:p,e,o,e  (E邻域点数大于等于3)
  • 点m从点p直接密度可达 (m在p的E邻域内,并且p为核心对象)
  • 点q从点p密度可达 (点q从点m直接密度可达,点m从点p直接密度可达,则点q从点p密度可达)
  • 点q从点s密度相连 (点q从点p密度可达,点p从点s密度可达,则点q从点s密度相连)

基于网格的聚类算法

 


      基于划分和层次聚类方法都无法发现非凸面形状的簇,真正能有效发现任意形状簇的算法是基于密度的算法,但基于密度的算法一般时间复杂度较高,1996年到2000年间,研究数据挖掘的学者们提出了大量基于网格的聚类算法,网格方法可以有效减少算法的计算复杂度,且同样对密度参数敏感。其典型算法如下:

  • STING:基于网格多分辨率,将空间划分为方形单元,对应不同分辨率
  • CLIQUE:结合网格和密度聚类的思想,子空间聚类处理大规模高维度数据
  • WaveCluster:用小波分析使簇的边界变得更加清晰

    这些算法用不同的网格划分方法,将数据空间划分成为有限个单元(cell)的网格结构,并对网格数据结构进行了不同的处理,但核心步骤是相同的:

  • 划分网格
  • 使用网格单元内数据的统计信息对数据进行压缩表达
  • 基于这些统计信息判断高密度网格单元
  • 最后将相连的高密度网格单元识别为簇 

基于模型的聚类算法

 


      基于模型的方法给每一个聚类假定一个模型,然后去寻找能很好的拟合模型的数据集。模型可能是数据点在空间中的密度分布函数或者其它。这样的方法通常包含的潜在假设是:数据集是由一系列的潜在概率分布生成的。当前多数基于模型的算法主要应用于仿生学方面。通常有两种尝试思路:统计学方法统计学方法(例如COBWEB、CLASSIT和AutoClass)和神经网络方法(例如SOM、ART、LVQ)。

  • COBWEB算法是一种非常有代表性的简单增量概念聚类算法,该算法使用分类属性-值对来描述输入对象,采用分类树的形式创建层次聚类。COBWEB 算法的优势是在不需要任何参数下可以自动更改划分中类的个数,这种操作是在每个属性上的概率分布是相互没有联系的基础上操作的,但COBWEB算法基于的假设条件不一定总是正确的,这在一定程度上会影响聚类结果,且该聚类算法不适合应用于数据量很大的数据集。
  • CLASSIT算法是在COBWEB算法基础上改进的算法,该算法利用一个改进的分类描述方法,允许对连续取值属性进行增量式聚类操作,聚类过程中为每个结点中的所有属性存储相应的连续正态分布。CLASSIT算法同样也不适合应用于数据量很大的数据集。
  • AutoClass 聚类算法类的个数由贝叶斯统计分析来估算获得。
  • SOM(Self-Organizing Maps )算法效仿人脑处理信号的特点开发出的一种人工神经网络聚类算法,该算法是可视的、高纬的、无监督的,在信息处理领域(如图像处理、语音识别等)应用的比较广。

     

参考资料