BIRCH算法

来源:互联网 发布:夏达姚非拉事件 知乎 编辑:程序博客网 时间:2024/06/07 07:09

1、BIRCH概述

       BIRCH(Balanced Iterative Reducing and Clustering Using Hierarchies)是一种针对大规模数据集的聚类算法,该算法中引入两个概念:聚类特征(Clustering Feature,CF)和聚类特征树(CF-tree),通过这两个概念对簇进行概括,利用各个簇之间的距离,采用层次方法的平衡迭代对数据集进行规约和聚类。

2、聚类特征(CF)

     CF是BIRCH增量聚类算法的核心,使用CF概括描述各簇的信息,设某簇中有N个D维数据点,则该簇的聚类特征定义为三元组:

                                           CF=(N,LS,SS)

其中,N是簇中点的数目,矢量LS是个各点的线性求和即

标量SS是各数据点的平方和即

       例:假设簇一有三个数据点(2,5)、(3,2)和(4,3),根据定义,簇一的聚类特征是
                 CF1=(3,(2+3+4,5+2+3),(22+52)+(32+22)+(42+32))
                        =(3,(9,10),67)
 
      CF具有可加性:CF1=(n1,LS1,SS1),CF2=(n2,LS2,SS2),则CF1+CF2=(n1+n2, LS1+LS2, SS1+SS2)表示将两个不相交的簇合并成一个大簇的聚类特征。
       设簇C2的CF2=(3,(35,36),857),那么,由簇C1和簇C2合并而来的簇C3的聚类特征CF3计算如下:
CF3=(3+3,(9+35,10+36),(67+857))=(6,(44,46),924)

       聚类特征本质上是给定簇的统计汇总,可以有效地对数据进行压缩,而且基于聚类特征可以很容易地推导出簇的许多统计量和距离度量。
       假设给定簇中有N个D维数据点,可用以下公式定义簇的质心X0,半径R和直径D
       簇质心=
       簇半径=
       簇直径=
       其中R是成员对象到质心的平均距离,D是簇中两两数据点的平均距离,这两个统计量都反映了簇内紧实度。
      
       不同簇间的距离度量通常用曼哈顿距离,公式如下:
        D0

3、聚类特征树(CF-tree)
     
       CF树存储了层次聚类的簇的特征,有三个参数:枝平衡因子β、叶平衡因子λ和空间阈值τ。CF树由根节点、枝节点和叶节点构成,非叶节点中包含不多于β个形如[CFi,childi]的条目(entry)。其中CFi表示该节点上子簇的聚类特征信息,指针childi指向该节点的子节点。叶节点中包含不多于λ个形如[CFi]的条目,此外每个叶节点中都包含指针prev指向前一个叶节点和指针next指向后一个叶节点。空间阈值τ用于限制叶节点的子簇的大小,即所有叶节点的各条目对应子簇的直径D(或半径R)不得大于τ,行如下图
                 
      例:β=2,λ=3

   
       各节点及其元项代表的簇间的关系如左图所示,需要说明的是,CF树上不保存任何数据点,仅有树的结构信息以及相关的聚类特征信息,因此CF树可以达到压缩数据的效果。

4、聚类特征树的生成
      
       (1) 从根节点root 开始递归往下,计算当前CF条目与要插入数据点之间的距离,寻找距离最小的那个路径,直到找到与该数据点最接近的叶节点中的条目。
       (2) 比较计算出的距离是否小于阈值T,如果小于则当前CF条目吸收该数据点,并更新路径上的所有CF三元组;反之,进行第三步。
       (3) 判断当前条目所在叶节点的CF条目个数是否小于λ,如果是,则直接将数据点插入作为该数据点的新条目,否则需要分裂该叶节点。分裂的原则是寻找该叶节点中距离最远的两个条目并以这两个条目作为种子CF,其他剩下的CF条目根据距离最小原则分配到这两个条目中,并更新整个CF树。依次向上检查父节点是否也要分裂,如果需要按和叶子节点分裂方式相同。

   3.1具体过程
       先定义好CF Tree的参数: 即枝平衡因子β(内部节点的最大CF数), 叶平衡因子λ(叶子节点的最大CF数),空间阈值τ( 叶节点每个CF的最大样本半径或直径)
       在最开始的时候,CF Tree是空的,没有任何样本,我们从训练集读入第一个样本点,将它放入一个新的CF三元组A,这个三元组的N=1,将这个新的CF放入根节点
                                     
       继续读入第二个样本点,我们发现这个样本点和第一个样本点A,在半径为T的超球体范围内,也就是说,他们属于一个CF,我们将第二个点也加入CF A,此时需要更新A的三元组的值。此时A的三元组中N=2
                                    
       读入第三个样本点,若我们发现这个点不能融入刚才前面的样本点形成的超球体内,就需要一个新的CF三元组B。此时根节点有两个CF三元组A和B
                                    
       读入第四个样本点,若发现和B在半径小于T的超球体内,继续更新
                                    

       
       什么时候CF Tree的节点需要分裂呢?
      
       假设我们现在的CF Tree 如下图, 节点LN1有三个CF, LN2和LN3各有两个CF。我们的叶子节点的最大CF数λ=3。此时一个新的样本点来了,计算得出它离LN1节点最近,那么开始判断它是否在sc1,sc2,sc3这3个CF对应的超球体之内,因不在,故需要建立一个新的CF,即sc8来容纳它。但我们的λ=3,也就是说LN1的CF个数已经达到最大值了,不能再创建新的CF了,此时就要将LN1节点一分为二了
                                    
      将LN1里所有CF元组中,找到两个最远的CF做为种子CF,然后将LN1节点里所有CF 即sc1, sc2, sc3,以及新样本点的新元组sc8划分到两个新的节点上。将LN1节点划分后的CF Tree如下图:
                                    
        若内部节点的最大CF数β=3,则此时会导致最大CF数超了,也就是说要继续,方法与前面一样,分裂后的CF Tree如下图
                                    
  
  4.1CF树瘦身
        
        BIRCH算法对CF树进行瘦身主要有两个方面的需求:
       (1)在将数据点插入到CF树的过程中,用于存储CF树节点及其相关信息的内存有限,导致部分数据点生长形成的CF树占满了所有内存,因此需要对CF树进行瘦身(增加空间阈值τ),以将余下数据点插入到CF树上;
       (2)CF树生长完毕后,叶元项对应的子簇太小,影响到后续聚类的速度和质量,需要对CF树进行瘦身,以增加叶节点子簇的尺寸,减小叶节点子簇的数量。

  4.2离群点处理
         
       BIRCH算法预留出一定空间用于潜在离群点的回收。在对当前CF树进行瘦身之后,需要搜索叶节点中的稀疏子簇,作为潜在离群点放入回收空间中。此处的稀疏子簇表示簇内数据点数量远远少于所有簇平均数据点数的叶节点子簇。放入回收空间后,需要同步剔除CF树上的相关路径及节点。
   
      在数据库中所有数据点都被实施插入CF树的操作后,扫描所有潜在离群点,并尝试插入到CF树中,如果仍未能插入CF树中,可以确定为真正离群点,得以删除。

5.算法流程与优缺点
   
     5.1算法流程
         1)将所有的样本依次读入,在内存中建立CF树;
         2)对第1阶段中的CF树进行瘦身(可选步骤);
         3)利用其它的一些聚类算法对所有的CF树叶节点进行聚类,这一步的主要目的是消除由于样本读入顺序导致的不合理的树结构,以及一些由于节点CF个数限制导致的树结构分裂。
BIRCH算法的关键是步骤一,后面两步都是为了优化最后的聚类结果

     5.2优点
          1、节省内存。叶子节点放在磁盘分区上,非叶子节点仅仅是存储了一个CF值,外加指向父节点和孩子节点的指针。
           2、快。计算两个簇的距离只需要用到(N,LS,SS)这三个值足矣。
           3、只需扫描一遍数据集即可建树。
           4、可识别噪声点。建立好CF树后把那些包含数据点少的子簇剔除。
   
     5.3缺点
           1、 结果依赖于数据点的插入顺序。本属于同一个簇的点可能由于插入顺序相差很远而分到不同的簇中,即使同一个点在不同的时刻被插入,也会被分到不同的簇中。

      2、对非球状的簇聚类效果不好。这取决于簇直径和簇间距离的计算方法。

      3、对高维数据聚类效果不好。

      4、由于每个节点只能包含一定数目的子节点,最后得出来的簇可能和自然簇相差很大。

      5、birch适合于处理需要数十上百小时聚类的数据,但在整个过程中算法一旦中断,一切必须从头再来

6、算法改进简述

       BIRCH算法只考虑到簇内各数据对象之间的关系,为叶子节点中的簇设置统一的空间阈值,在数据对象插入时,根据数据对象与簇之间的距离来决定数据对象的插入位置,忽略了簇与簇之间的关系,这种方式有很大局限性得到的是具有相同阈值的多个簇。因此适合于体积相差不大的簇之间的聚类,而对于相差较大的簇而言聚类效果并不是很好。
      
       引入多阈值BIRCH算法,将阈值也作为簇的属性,为每个簇设立一个阈值,即将聚类特征CF表示为CF=(N,LS,SS,T)T表示该簇的阈值。非叶子节点中的CF也包含阈值T,用来存储子节点的阈值的信息,描述子节点中簇与簇的关系。在插入过程中综合考虑两方面因素:与中心点的距离和簇的阈值,从而提高了数据对象插入的准确性。







                            
(注:参考刘建平Pinard BIRCH聚类算法原理及挑子学习笔记:BIRCH层次聚类)








原创粉丝点击