1.层次聚类通过相似度来创建聚类树,把每个样本点当成一个簇

2.BIRCH全称是利用层次方法的平衡迭代规约和聚类

3.BIRCH算法关键是构建聚类特征树

4.聚类特征树由非叶子节点个数B每个叶子节点的CF数L、半径阈值T决定

5.BIRCH算法聚类速度快、能识别噪音点;但对高维、非凸数据效果不好

K-means是基于质心的聚类算法,谱聚类是基于无向图的聚类方法,这一篇我们介绍一种新的聚类方法——BIRCH算法,开始前先介绍与之相关的聚类算法——层次聚类(Hierarchical Clustering)

算法思路

层次聚类主要通过计算数据点间的相似度来创建一棵有层次的嵌套聚类树,它试图在不同层次对数据集进行划分,从而形成树形的聚类结构。

初始时每个样本各为一簇,然后开始逐步合并的过程,算法步骤如下:

step1:将每个样本都视为一个聚类

step2:计算各个聚类之间的相似度

step3:寻找最近的两个聚类,将他们归为一类

step4:重复步骤二,步骤三;直到所有样本归为一类

我们举个例子来说明这个思想,对于以下一维特征的7个样本点A—G:

注:两个聚类之间相似性的度量采取所有样本距离的均值,这里距离用欧式距离衡量,sklearn包AgglomerativeClustering的参数linkge取“average”:

根据层次聚类算法流程,首先计算每个样本点的两两相似度:

相似度最近的是点B和C,将它们合并,重新计算所有聚类的相似度:

第1次聚类结果

D与E相似度最近,合并:

第2次聚类结果

重复上述过程,我们得到每一步的聚类结果:

第3次聚类结果

第4次聚类结果

第5次聚类结果

注:合并后对角的值是合并样本点的均值(这里可忽略)

用图来表示,每一个步骤的聚类样本点如下:

由此,我们可以知道,聚类结果与标签如下表所示:

聚类类别数
样本标签
2
{ABCF}  {DEG}
3
{ABCF}  {DE}  {G}
4
{A} {BCF} {DE} {G}
5
{A} {BC} {DE} {F} {G}

我们可以用sklearn包的层次聚类AgglomerativeClustering去检验:

结果得到验证。

算法变种

我们今天的主题并非是标准的层次聚类算法,而是它的一个拓展算法——BIRCH算法。它也是一种层次聚类算法,全称是利用层次方法的平衡迭代规约和聚类英文是Balanced Iterative Reducing and Clustering using Hierarchies。

BIRCH算法利用树结构进行快速聚类,这棵树称为聚类特征树(Clustering Feature Tree,简称CF Tree),该树的每一个节点由若干聚类特征(Clustering Feature,简称CF)组成。为此,先介绍聚类特征(CF)

聚类特征

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

举一个例子,设某个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=(3^2+2^2+4^2+4^2+3^2+4^2+6^2+5^2+7^2+8^2)=54+190=244

CF有一个很好的性质——满足线性关系,即:

CF1+CF2=(N1+N2,LS1+LS2,SS1+SS2)

聚类特征树

有了CF的概念和性质,我们看看CF Tree的性质,主要有两点:

  • 树中的非叶子节点有后代

  • 非叶子节点存储了其后代的CF总和

CF Tree的参数有三个:

  • 非叶子节点最大个数B(分支因子)

  • 每个叶子节点包含的最大CF数L

  • 叶子节点每个CF的最大半径阈值T

接下来我们看看CF Tree是怎么生成的。

给定参数B、L、T.

首先,读入第一个样本,将其纳入新的三元组LN1;

接着,读入第二个样本,如果它与前一个样本在半径为T的球体内,则置为同一个三元组,否则生成新的三元组LN2

那么什么时候进行分裂呢,假设已经生成了三元组LN1,LN2(给定参数B=2,L=3):

这时候再读入一个新样本(图中橙色点),它离LN1节点最近,但都不再SC1,SC2,SC3的超球体半径T内,这时候需要一个新的SC6来容纳它。

又因为我们的L=3,LN1的CF数达到最大,不能再创建新的CF,此时就需要进行分裂,节点LN1一分为二。分裂标准是:

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

直接一分为二的话,又不满足参数B=2(此时叶子结点一共3个),所以根节点要进行分裂:


综上,我们可以得到聚类特征树(CF Tree)的生成过程

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

2.如果新样本加入后,这个CF节点对应的超球体半径仍然满足小于阈值T,则更新路径上所有的CF三元组,插入结束。否则转入3

3.如果当前叶子节点的CF节点个数小于阈值L,则创建一个新的CF节点,放入新样本,将新的CF节点放入这个叶子节点,更新路径上所有的CF三元组,插入结束。否则转入4

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

                      

算法流程

有了聚类特征树的铺垫,就可以直接引出BIRCH算法了,它的流程是:

1) 将所有的样本依次读入,建立一颗聚类特征树CF Tree

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

3)(可选)利用其它的一些聚类算法对所有的CF元组进行聚类,得到一颗比较好的CF Tree.这一步的主要目的是消除由于样本读入顺序导致的不合理的树结构,以及一些由于节点CF个数限制导致的树结构分裂

4)(可选)利用第三步生成的CF Tree的所有CF节点的质心,作为初始质心点,对所有的样本点按距离远近进行聚类。这样进一步减少了由于CF Tree的一些限制导致的聚类不合理的情况。

    

BIRCH算法的关键就是CF Tree的生成,其他步骤都是为了优化最后的聚类结果。

算法总结

总结一下BIRCH算法的主要优缺点。它的优点是聚类速度快,可以识别噪音点,还可以对数据集进行初步分类的预处理;主要缺点有:对高维特征数据、非凸数据集效果不好;由于CF个数的限制会导致与真实类别分布不同.

最后,在多说一句,Mini Batch K-means一般用于类别数适中或者较少的时候,而BIRCH适用于类别数比较大的情况,除此之外,BIRC还可以做一些异常点检测。

参考资料:

https://www.cnblogs.com/pinard/p/6179132.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐