Birch

先贴出我借鉴的博客

  1. https://www.cnblogs.com/pinard/p/6179132.html
  2. https://blog.csdn.net/congnaahahei/article/details/78881128

       BIRCH的全称是利用层次方法的平衡迭代规约和聚类(Balanced Iterative Reducing and Clustering Using Hierarchies),这个聚类算法只需要单遍扫描数据集就能进行聚类,BIRCH利用了一个树结构来帮助我们快速的聚类,这个树结构类似于平衡B+树,一般将它称之为聚类特征树(Clustering Feature Tree,简称CF Tree),这颗树的每一个节点是由若干个聚类特征(Clustering Feature,简称CF)组成。CF树的结构是:每个节点包括叶子节点都有若干个CF,而内部节点的CF有指向孩子节点的指针,所有的叶子节点用一个双向链表链接起来。(如下图)

                        

聚类特征CF:

       每一个CF是一个三元组,可以用(N,LS,SS)表示。其中N代表了这个CF中拥有的样本点的数量;LS代表了这个CF中拥有的样本点各特征维度的和向量,SS代表了这个CF中拥有的样本点各特征维度的平方和。

       举例: 

                                  

       在这个结点中共有5个样本(N=5),每个样本的对应x坐标相加为LS(x)=3+2+4+4+3=16, y坐标相加为LS(y)=4+6+5+7+8=30,每个样本的对应x坐标的平方和为SS(x)=3^2+2^{2}+4^{2}+4^2+3^2=54,y坐标的平方和为SS(y)=4^2+6^2+5^2+7^2+8^2=190。则对应的CF为(5,(16,30),(54,190))

        聚类特征本质上是给定簇的统计汇总,可以有效地对数据进行压缩,而且基于聚类特征可以很容易地推导出簇的许多统计量和距离度量。
        假设给定簇中有N个D维数据点,可用以下公式定义簇的质心X0,半径R和直径D

        簇质心                                     
        簇半径             

        簇直径                  

       其中R是成员对象到质心的平均距离,D是簇中两两数据点的平均距离,这两个统计量都反映了簇内紧实度。

       不同簇间的距离度量通常用曼哈顿距离,公式如下:

        D0 

       在CF Tree中,对于每个父节点中的CF节点,它的(N,LS,SS)三元组的值等于这个CF节点所指向的所有子节点的三元组之和。

                              

       对于CF Tree,我们一般有几个重要参数,第一个参数是每个内部节点的最大CF数B,第二个参数是每个叶子节点的最大CF数L,第三个参数是针对叶子节点中某个CF中的样本点来说的,它是叶节点每个CF的最大样本半径阈值T,也就是说,在这个CF中的所有样本点一定要在半径小于T的一个超球体内。对于上图中的CF Tree,限定了B=7, L=5, 也就是说内部节点最多有7个CF,而叶子节点最多有5个CF。

CF Tree的生成:

       最开始的时候CF Tree是空的,没有任何样本,我们读入一个样本A,并且把它放入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数L=3。此时一个新的样本点来了,我们发现它离LN1节点最近,因此开始判断它是否在sc1,sc2,sc3这3个CF对应的超球体之内,但是很不幸,它不在,因此它需要建立一个新的CF,即sc8来容纳它。问题是我们的L=3,也就是说LN1的CF个数已经达到最大值了,不能再创建新的CF了,怎么办?此时就要将LN1叶子节点一分为二了。

       我们将LN1里所有CF元组中,找到两个最远的CF做这两个新叶子节点的种子CF,然后将LN1节点里所有CF sc1, sc2, sc3,以及新样本点的新元组sc8划分到两个新的叶子节点上。将LN1节点划分后的CF Tree如下图:

       如果我们的内部节点的最大CF数B=3,则此时叶子节点一分为二会导致根节点的最大CF数超了,也就是说,我们的根节点现在也要分裂,分裂的方法和叶子节点分裂一样,分裂后的CF Tree如下图:

       总结下CF Tree的插入:

  1. 从根节点向下寻找和新样本距离最近的叶子节点和叶子节点里最近的CF节点
  2. 如果新样本加入后,这个CF节点对应的超球体半径仍然满足小于阈值T,则更新路径上所有的CF三元组,插入结束。否则转入3.
  3. 如果当前叶子节点的CF节点个数小于阈值L,则创建一个新的CF节点,放入新样本,将新的CF节点放入这个叶子节点,更新路径上所有的CF三元组,插入结束。否则转入4。
  4. 将当前叶子节点划分为两个新叶子节点,选择旧叶子节点中所有CF元组里超球体距离最远的两个CF元组,分别作为两个新叶子节点的第一个CF节点。将其他元组和新样本元组按照距离远近原则放入对应的叶子节点。依次向上检查父节点是否也要分裂,如果需要按和叶子节点分裂方式相同。

BIRCH优点:

  1. 节约内存,所有的样本都在磁盘上,CF Tree仅仅存了CF节点和对应的指针。
  2. 聚类速度快,只需要一遍扫描训练集就可以建立CF Tree,CF Tree的增删改都很快。
  3. 可以识别噪音点,还可以对数据集进行初步分类的预处理

BIRCH缺点:

  1. 由于CF Tree对每个节点的CF个数有限制,导致聚类的结果可能和真实的类别分布不同.
  2. 对高维特征的数据聚类效果不好。此时可以选择Mini Batch K-Means
  3. 如果数据集的分布簇不是类似于超球体,或者说不是凸的,则聚类效果不好。

猜你喜欢

转载自blog.csdn.net/hierarch0/article/details/81162095