BIRCH聚类算法原理

    在K-Means聚类算法原理中,咱们讲到了K-Means和Mini Batch K-Means的聚类原理。这里咱们再来看看另一种常见的聚类算法BIRCH。BIRCH算法比较适合于数据量大,类别数K也比较多的状况。它运行速度很快,只须要单遍扫描数据集就能进行聚类,固然须要用到一些技巧,下面咱们就对BIRCH算法作一个总结。html

1. BIRCH概述

    BIRCH的全称是利用层次方法的平衡迭代规约和聚类(Balanced Iterative Reducing and Clustering Using Hierarchies),名字实在是太长了,不过不要紧,其实只要明白它是用层次方法来聚类和规约数据就能够了。刚才提到了,BIRCH只须要单遍扫描数据集就能进行聚类,那它是怎么作到的呢?算法

    BIRCH算法利用了一个树结构来帮助咱们快速的聚类,这个数结构相似于平衡B+树,通常将它称之为聚类特征树(Clustering Feature Tree,简称CF Tree)。这颗树的每个节点是由若干个聚类特征(Clustering Feature,简称CF)组成。从下图咱们能够看看聚类特征树是什么样子的:每一个节点包括叶子节点都有若干个CF,而内部节点的CF有指向孩子节点的指针,全部的叶子节点用一个双向链表连接起来。post

    有了聚类特征树的概念,咱们再对聚类特征树和其中节点的聚类特征CF作进一步的讲解。优化

2. 聚类特征CF与聚类特征树CF Tree

     在聚类特征树中,一个聚类特征CF是这样定义的:每个CF是一个三元组,能够用(N,LS,SS)表示。其中N表明了这个CF中拥有的样本点的数量,这个好理解;LS表明了这个CF中拥有的样本点各特征维度的和向量,SS表明了这个CF中拥有的样本点各特征维度的平方和。举个例子以下图,在CF Tree中的某一个节点的某一个CF中,有下面5个样本(3,4), (2,6), (4,5), (4,7), (3,8)。则它对应的N=5, LS=$(3+2+4+4+3, 4+6+5+7+8) = (16,30)$, SS =$(3^2+2^2+4^2 +4^2+3^2 + 4^2+6^2+5^2 +7^2+8^2) = (54 + 190) = 244$3d

    CF有一个很好的性质,就是知足线性关系,也就是$CF1+CF2 = (N_1+N_2, LS_1+LS_2, SS_1 +SS_2)$。这个性质从定义也很好理解。若是把这个性质放在CF Tree上,也就是说,在CF Tree中,对于每一个父节点中的CF节点,它的(N,LS,SS)三元组的值等于这个CF节点所指向的全部子节点的三元组之和。以下图所示:指针

    从上图中能够看出,根节点的CF1的三元组的值,能够从它指向的6个子节点(CF7 - CF12)的值相加获得。这样咱们在更新CF Tree的时候,能够很高效。htm

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

 3. 聚类特征树CF Tree的生成

    下面咱们看看怎么生成CF Tree。咱们先定义好CF Tree的参数: 即内部节点的最大CF数B, 叶子节点的最大CF数L, 叶节点每一个CF的最大样本半径阈值T内存

    在最开始的时候,CF Tree是空的,没有任何样本,咱们从训练集读入第一个样本点,将它放入一个新的CF三元组A,这个三元组的N=1,将这个新的CF放入根节点,此时的CF Tree以下图:ci

    如今咱们继续读入第二个样本点,咱们发现这个样本点和第一个样本点A,在半径为T的超球体范围内,也就是说,他们属于一个CF,咱们将第二个点也加入CF A,此时须要更新A的三元组的值。此时A的三元组中N=2。此时的CF Tree以下图:

    此时来了第三个节点,结果咱们发现这个节点不能融入刚才前面的节点造成的超球体内,也就是说,咱们须要一个新的CF三元组B,来容纳这个新的值。此时根节点有两个CF三元组A和B,此时的CF Tree以下图:

    当来到第四个样本点的时候,咱们发现和B在半径小于T的超球体,这样更新后的CF Tree以下图:

    那个何时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的插入就没有什么问题了,总结下CF Tree的插入:

    1. 从根节点向下寻找和新样本距离最近的叶子节点和叶子节点里最近的CF节点

    2. 若是新样本加入后,这个CF节点对应的超球体半径仍然知足小于阈值T,则更新路径上全部的CF三元组,插入结束。不然转入3.

    3. 若是当前叶子节点的CF节点个数小于阈值L,则建立一个新的CF节点,放入新样本,将新的CF节点放入这个叶子节点,更新路径上全部的CF三元组,插入结束。不然转入4。

    4.将当前叶子节点划分为两个新叶子节点,选择旧叶子节点中全部CF元组里超球体距离最远的两个CF元组,分布做为两个新叶子节点的第一个CF节点。将其余元组和新样本元组按照距离远近原则放入对应的叶子节点。依次向上检查父节点是否也要分裂,若是须要按和叶子节点分裂方式相同。

4. BIRCH算法

    上面讲了半天的CF Tree,终于咱们能够步入正题BIRCH算法,其实将全部的训练集样本创建了CF Tree,一个基本的BIRCH算法就完成了,对应的输出就是若干个CF节点,每一个节点里的样本点就是一个聚类的簇。也就是说BIRCH算法的主要过程,就是创建CF Tree的过程。

    固然,真实的BIRCH算法除了创建CF Tree来聚类,其实还有一些可选的算法步骤的,如今咱们就来看看 BIRCH算法的流程。

    1) 将全部的样本依次读入,在内存中创建一颗CF Tree, 创建的方法参考上一节。

    2)(可选)将第一步创建的CF Tree进行筛选,去除一些异常CF节点,这些节点通常里面的样本点不多。对于一些超球体距离很是近的元组进行合并

    3)(可选)利用其它的一些聚类算法好比K-Means对全部的CF元组进行聚类,获得一颗比较好的CF Tree.这一步的主要目的是消除因为样本读入顺序致使的不合理的树结构,以及一些因为节点CF个数限制致使的树结构分裂。

    4)(可选)利用第三步生成的CF Tree的全部CF节点的质心,做为初始质心点,对全部的样本点按距离远近进行聚类。这样进一步减小了因为CF Tree的一些限制致使的聚类不合理的状况。

    从上面能够看出,BIRCH算法的关键就是步骤1,也就是CF Tree的生成,其余步骤都是为了优化最后的聚类结果。

5. BIRCH算法小结

    BIRCH算法能够不用输入类别数K值,这点和K-Means,Mini Batch K-Means不一样。若是不输入K值,则最后的CF元组的组数即为最终的K,不然会按照输入的K值对CF元组按距离大小进行合并。

    通常来讲,BIRCH算法适用于样本量较大的状况,这点和Mini Batch K-Means相似,可是BIRCH适用于类别数比较大的状况,而Mini Batch K-Means通常用于类别数适中或者较少的时候。BIRCH除了聚类还能够额外作一些异常点检测和数据初步按类别规约的预处理。可是若是数据特征的维度很是大,好比大于20,则BIRCH不太适合,此时Mini Batch K-Means的表现较好。

    对于调参,BIRCH要比K-Means,Mini Batch K-Means复杂,由于它须要对CF Tree的几个关键的参数进行调参,这几个参数对CF Tree的最终形式影响很大。

    最后总结下BIRCH算法的优缺点:

     BIRCH算法的主要优势有:

    1) 节约内存,全部的样本都在磁盘上,CF Tree仅仅存了CF节点和对应的指针。

    2) 聚类速度快,只须要一遍扫描训练集就能够创建CF Tree,CF Tree的增删改都很快。

    3) 能够识别噪音点,还能够对数据集进行初步分类的预处理

    BIRCH算法的主要缺点有:

    1) 因为CF Tree对每一个节点的CF个数有限制,致使聚类的结果可能和真实的类别分布不一样.

    2) 对高维特征的数据聚类效果很差。此时能够选择Mini Batch K-Means

    3) 若是数据集的分布簇不是相似于超球体,或者说不是凸的,则聚类效果很差。

 

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com) 

相关文章
相关标签/搜索