python机器学习案例系列教程——BIRCH聚类全栈⼯程师开发⼿册 (作者:栾鹏)
1. BIRCH概述
BIRCH的全称是利⽤层次⽅法的平衡迭代规约和聚类(Balanced Iterative Reducing and Clustering Using Hierarchies),名字实在是太长了,不过没关系,其实只要明⽩它是⽤层次⽅法来聚类和规约数据就可以了。刚才提到了,BIRCH只需要单遍扫描数据集就能进⾏聚类,那它是怎么做到的呢?
BIRCH算法利⽤了⼀个树结构来帮助我们快速的聚类,这个数结构类似于平衡B+树,⼀般将它称之为聚类特征树(Clustering Feature Tree,简称CF Tree)。这颗树的每⼀个节点是由若⼲个聚类特征(Clustering Feature,简称CF)组成。从下图我们可以看看聚类特征树是什么样⼦的:树中的每个节点(包括叶⼦节点)都有若⼲个CF,⽽内部节点的CF有指向孩⼦节点的指针,所有的叶⼦节点⽤⼀个双向链表链接起来。
类pascal语言
有了聚类特征树的概念,我们再对聚类特征树和其中节点的聚类特征CF做进⼀步的讲解。
树中的每个节点都对应⼀个簇(或者叫聚类)。⼦节点对应的簇是⽗节点对应的簇的⼦簇,所以BIRCH算法算是基于层次的聚类算法。
2. 聚类特征CF与聚类特征树CF Tree
在聚类特征树中,⼀个节点的聚类特征CF是这样定义的:每⼀个CF是⼀个三元组,可以⽤(N,LS,SS)表⽰。其中N代表了这个簇中拥有的样本点的数量,这个好理解;LS代表了这个簇中拥有的样本点各特征维度的和向量,SS代表了这个簇中拥有的样本点各特征维度的平⽅和。举个例⼦如下图,在CF Tree中的某⼀个节点对应的簇中,有下⾯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 =(32+22+42+42+32+42+62+52+72+82)=(54+190)=244
CF有⼀个很好的性质,就是满⾜线性关系,也就是CF1+CF2=(N1+N2,LS1+LS2,SS1+SS2)。这个性质从定义也很好理解。如果把这个性质放在CF Tree上,也就是说,在CF Tree中,对于每个⽗节点中的CF,它的(N,LS,SS)三元组的值等于它的⼦节点的三元组之和。如下图所⽰:
从上图中可以看出,根节点的CF1的三元组的值,可以从它指向的6个⼦节点(CF7 - CF12)的值相加得到。这样我们在更新CF Tree的时候,可以很⾼效。
call it spring对于CF Tree,我们⼀般有⼏个重要参数,第⼀个参数是分⽀因⼦B,表⽰每个⾮叶节点的⼦⼥的最⼤数⽬,第⼆个参数是阈值T,表⽰存储在树的叶节点中的⼦簇的最⼤直径。也就是说,叶节点对应的⼦簇中的所有样本点⼀定要在直径⼩于T的⼀个超球体内。有时还会定义叶节点的分⽀因⼦L,表⽰每个叶节点对应的⼦簇的最⼤样本个数。对于上图中的CF Tree,限定了B=7, L=5, 也就是说内部节点最多有7个⼦节点,⽽叶⼦节点对应的簇最多有5个样本。
3. 聚类特征树CF Tree的⽣成
进程和线程的区别是?(注意区分:样本点、CF节点(树中的才分为节点))
万达screenx什么意思下⾯我们看看怎么⽣成CF Tree。我们先定义好CF Tree的参数: 即内部节点的最⼤⼦节点数B, 叶⼦节点对应的簇的最⼤样本数L, 叶节点对应的簇的最⼤样本直径阈值T。
在最开始的时候,CF Tree是空的,没有任何样本,我们从训练集读⼊第⼀个样本点x1,将它放⼊⼀个新的节点A,这个节点的CF值中
N=1,将这个新的节点作为根节点,此时的CF Tree如下图:
现在我们继续读⼊第⼆个样本点x2,我们发现这个样本点和第⼀个样本点x1,在直径为T的超球体范围内,也就是说,他们属于⼀个簇,我们将第⼆个点也加⼊节点A所代表的簇中,此时需要更新节点A的CF值。此时A的CF值中N=2。此时的CF Tree如下图:
此时来了第三个节点x3,结果我们发现这个节点不能融⼊刚才前⾯的节点形成的超球体内,也就是说,我们需要新建⼀个簇来容纳x3,同时为这个簇在CF树中添加⼀个新的节点B。此时根节点有两个⼦节点,A和B,此时的CF Tree如下图:
当来到第四个样本点x4的时候,我们发现和节点B代表的簇在直径⼩于T的超球体,这样更新后的CF Tree如下图:
那个什么时候CF Tree的节点需要分裂呢?假设我们现在的CF Tree 如下图, 叶⼦节点LN1代表的簇有三个样本, LN2和LN3各有两个样本。我们的叶⼦节点的最⼤样本数L=3。此时⼀个新的样本点来了,我们发现它离LN1节点代表的簇最近,因此开始判断它是否在
sc1,sc2,sc3这3个样本对应的超球体之内,但是很不幸,它不在,因此它需要建⽴⼀个新的叶⼦节点来容纳它。问题是我们的L=3,也就是说LN1的样本个数已经达到最⼤值了,不能再添加新的样本了,怎么办?此时就要将LN1叶⼦节点⼀分为⼆了。
我们将LN1⾥所有样本中,到两个最远的样本做这两个新叶⼦节点的种⼦样本,然后将LN1节点⾥所有样本sc1, sc2, sc3,以及新样本点sc8划分到两个新的叶⼦节点上。将LN1节点划分后的CF Tree如下图:
css中的margin属性auto如果我们的内部节点的最⼤⼦节点数B=3,则此时叶⼦节点⼀分为⼆会导致根节点的最⼤⼦节点数超了,也就是说,我们的根节点现在也要分裂,分裂的⽅法和叶⼦节点分裂⼀样,分裂后的CF Tree如下图:
有了上⾯这⼀系列的图,相信⼤家对于CF Tree的插⼊就没有什么问题了,总结下CF Tree的插⼊:
1. 从根节点向下寻和新样本距离最近的叶⼦节点和叶⼦节点⾥最近的样本节点
2. 如果新样本加⼊后,这个样本节点对应的超球体直径仍然满⾜⼩于阈值T,则将新样本点加⼊叶⼦
节点对应的簇中,并更新路径上所有的树节点,插⼊结束。否则转⼊
python在线编辑器python33.
    3.将当前叶⼦节点划分为两个新叶⼦节点,选择旧叶⼦节点中所有样本点中距离最远的样本点,分布作为两个新叶⼦节点的第⼀个样本节点。将其他样本和新样本按照距离远近原则放⼊对应的叶⼦节点。依次向上检查⽗节点是否也要分裂,如果需要,按和叶⼦节点分裂⽅式相同。
4. BIRCH算法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。