赞
踩
BIRCH聚类算法(平衡迭代规约层次聚类)
算法利用聚类特征树(CF Tree)来进行聚类,聚类特征树类似于平衡B+树,主要通过计算数据点间的相似度来创建一棵有层次的嵌套聚类树(如图1所示),它试图在不同层次对数据集进行划分,从而形成树形的聚类结构。
图1 嵌套聚类树示意图
算法主要分为两个阶段:
阶段一对整个数据集进行扫描,建立一棵初始化的聚集特征树(CF-tree)尽可能地包含所有属性的信息;
阶段二用聚集特征代替原有数据集进行聚类.在第一阶段聚集特征树是随着对象一个一个地加入而自动形成的:一个对象被放入那个离它最近的叶子节点(簇)中去.如果放入以后这个簇的半径大于阈值 T 的话,那么这个叶节点就会被分割(Split).新对象插入以后关于这个对象的信息向根节点传递.插入过程类似于 B+树构建中的插入和节点分裂.聚集特征树的大小可以通过调节参数来改变,如果存储树需要的内存超过了主存,可以定义一个较小的阈值,然后通过提升阈值重新建立一棵聚类特征树,这个重建过程并不需要将整个记录扫描一次,而是建立在原有树的叶子节点的基础之上的。因此,建立一个树,数据记录只需要被扫描一次.当树建好以后可以在第二阶段用其他的聚类算法对聚类特征进行聚类.
每一个CF是一个三元组,可以用(N,LS,SS)表示。其中N代表了这个CF中拥有的样本点的数量;LS代表了这个CF中拥有的样本点各特征维度的和向量,SS代表了这个CF中拥有的样本点各特征维度的平方和。
例如,在CF Tree中的某一个节点的某一个CF中,有5个样本(3,4), (2,6), (4,5), (4,7), (3,8)。则其对应的CF三元组如下所示:
N=5
LS=3+2+4+4+3,4+6+5+7+8=16,30
SS=32+22+42+42+32+42+62+52+72+82=54+190=244
簇半径(相当于全局标准差)为:
R=SSN-LS2N2
任意两个簇之间的距离为:
D=i=1N1j=1N2xi-xj2N1N2=SS1N1+SS2N2-2LS1∙LS2N1N2
图
2 聚类特征树(CF Tree)示意图
参考数据挖掘入门笔记——BIRCH聚类(一拍即合) - 知乎 (zhihu.com)
BIRCH聚类算法原理 - 刘建平Pinard - 博客园 (cnblogs.com)
①从根节点向下寻找和新样本距离最近的叶子节点和叶子节点里最近的CF节点
②如果新样本加入后,这个CF节点对应的超球体半径仍然满足小于阈值T,则更新路径上所有的CF三元组,插入结束。否则转入3
③如果当前叶子节点的CF节点个数小于阈值L,则创建一个新的CF节点,放入新样本,将新的CF节点放入这个叶子节点,更新路径上所有的CF三元组,插入结束。否则转入4。
④将当前叶子节点划分为两个新叶子节点,选择旧叶子节点中所有CF元组里超球体距离最远的两个CF元组,分布作为两个新叶子节点的第一个CF节点。将其他元组和新样本元组按照距离远近原则放入对应的叶子节点。依次向上检查父节点是否也要分裂,如果需要按照叶子节点分裂方式进行分裂。
①如果在,也就是说他们属于同一个CF,根据 CF 可加性,更新CF
②如果不在,需要一个新的CF三元组,来容纳这个新的样本点
参考(182条消息) 机器学习笔记(九)聚类算法Birch和层次聚类Hierarchical clustering_birch算法流程图_大白兔黑又黑的博客-CSDN博客
假设已有数据集为:{[0, 1], [0.3, 1], [-0.3, 1], [0, -1], [0.3, -1], [-0.3, -1], [-0.3,-1.1],[1,2]},构建 CF Tree 每个分支节点的最大CF数B和每个叶子节点的最大CF数L都取2,叶节点每个CF的最大样本半径阈值T为0.2。CF Tree的构建过程如下:
为了方便表述,将数据集用样本点描述,即
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
数据集 | [0,1] | [0.3,1] | [-0.3,1] | [0,-1] | [0.3,-1] | [-0.3,-1] | [-0.3,-1.1] | [1,2] |
样本点 | A | B | C | D | E | F | G | H |
将样本点A放入根节点
尝试将样本点B加入CF1,则CF1三元组变为(2,(0.3,2),2.09),CF1的簇半径RCF1=2.092-0.32+2222=0.15<T,所以可以将样本点B加入CF1,并更新已有三元组:
尝试将样本点C加入CF1,则CF1三元组变为(3,(0,3),3.18),CF1的簇半径RCF1=3.183-02+3232=0.24>T,所以不可以将样本点C入CF1;
需要创建一个新的三元组CF2(1,( -0.3,1),1.09),与三元组CF1一同放在根节点中,并更新已有三元组:
将样本点D看作一个单独的三元组(1,(0,-1),1), 分别计算样本点D和CF三元组CF1、CF2之间的距离,D(D,CF1)=11+2.092-2×(0-2)1×2=2.01,D(D,CF2)=11+1.091-2×(0-1)1×1=2.02,距离三元组CF1最近;
尝试把样本点D加入三元组CF1,则三元组CF1变为(3,(0.3,1),3.09),CF1的簇半径RCF1=3.093-0.32+1232=0.95>T,因此不可以将样本点D加入三元组CF1;
为样本点D分配新的三元组CF3(1,(0,-1),1),挂在与其距离最近的三元组CF1上,但是三元组CF1中已经有两个样本点,达到最大值L,因此需要将三元组CF0进行分裂,以分层容纳CF1、CF2、CF3三个三元组,计算CF1和CF2之间的距离
D(CF1,CF2)=2.092+1.091-2×(-0.09+2)2×1=0.47
CF2和CF3(此时仅包含样本点D)距离最远,将其作为种子继续向下分裂,由于三元组CF1距离CF3最近,将其分配到同一个叶子节点中。
分别计算样本点E到叶子节点L1、L2之间的距离,可以发现距离叶子节点L2更近,应该将其挂在L2上,尝试将样本点E加入三元组CF3,加入后三元组CF3的簇半径为0.15,小于T,因此可以加入三元组CF3,并更新已有三元组。
分别计算样本点F到叶子节点L1、L2之间的距离,可以发现距离叶子节点L2更近,应该将其挂在L2上,尝试将样本点F加入三元组CF3,加入后三元组CF3的簇半径大于T,因此在L2中为样本点F分配新的三元组,并更新已有三元组。
分别计算样本点H到叶子节点L1、L2之间的距离,可以发现距离叶子节点L1更近,应该将其挂在L1上;
由于叶子节点L1中有两个三元组CF1、CF2,继续计算样本点H和CF1、CF2之间的距离,发现距离三元组CF1更近,尝试将样本点H加入三元组CF1,加入后三元组CF1的簇半径大于T,因此不能直接加入三元组CF1;
为样本点H分配新的三元组CF5(1,(1,2),5),计算CF1、CF2、CF5之间的簇间距,三元组CF2和CF5之间距离最大,将其作为种子继续向下分裂,由于三元组CF1距离CF2最近,将其分配到同一个叶子节点中。
BIRCH算法比较适合于数据量大,类别数K也比较多的情况。
(参考论文《一种改进的 BIRCH 聚类分析算法及其应用研究》)
主要思想:为每个簇设立一个阈值S
引入分裂因子 S 定义为叶子节点离差平方和的上限,当有新的节点加入到叶结点时,如果新的叶节点的离差平方和大于 S ,无论原来节点是否有存储空间(节点的条目小于L )都将要产生一个新的叶结点.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。