Birch层次聚类

Birch层次聚类算法

标签(空格分隔): CF树建立


主要借鉴的网文地址,并进行大量引用:【非常浅显易懂】
http://www.cnblogs.com/pinard/p/6179132.html 【主要以此文为主】
http://www.cnblogs.com/tiaozistudy/p/6129425.html
根据上述第二个网址的步骤,进行代码化的代码地址:
https://github.com/AresAnt/ML-DL/tree/master/Clustering/Birch

BIRCH算法比较适合于数据量大,类别数K也比较多的情况。它运行速度很快,只需要单遍扫描数据集就能进行聚类,当然需要用到一些技巧,下面我们就对BIRCH算法做一个总结。
【个人建议,如想要自己写CF树生成代码前,请先了解一下B+树的构造与写法对之后的代码完成将会有帮助。】

1.聚类特征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 = (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)三元组的值等于这个CF节点所指向的所有子节点的三元组之和。如下图所示:



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

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

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

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

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


现在我们继续读入第二个样本点,我们发现这个样本点和第一个样本点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节点。将其他元组和新样本元组按照距离远近原则放入对应的叶子节点。依次向上检查父节点是否也要分裂,如果需要按和叶子节点分裂方式相同

3.Birch算法流程

如不愿看下列粗糙流程,可以参考:http://www.cnblogs.com/tiaozistudy/p/twostep_cluster_algorithm.html【之前给出的第二个网站,根据其步骤进行操作】

# 获取的初始化参数的值,枝平衡银子β,叶平衡因子λ,空间阈值T,以及是否
class Birch_Class():

    # 获取的初始化参数的值,枝平衡因子β,叶平衡因子λ,空间阈值T,以及是否
    def __init__(self,branch_balance=2,leaf_balance=3,threshold=3,compute_labels=True):
        self.branch_balance = branch_balance
        self.leaf_balance = leaf_balance
        self.threshod = threshold
        self.compute_labels=compute_labels

传入参数:

  • 分支平衡参数: branch_balance
  • 叶子平衡参数: leaf_balance
  • 空间阈值: threshold
    ---以上三者数据用来初始化类的基本属性

1.初始化CF树为空树(建立一个TreeNode,每个TreeNode有N个CFNode)【N与分支平衡因子与叶平衡因子有关】
2.逐条导入数据(后面统一用簇来代替),进行CF树的填充
3.判断当前插入的簇与TreeNode中最近的的CFNode(CF簇),然后筛选出该簇,进行同样的递归计算,直到叶子节点。

#伪代码:
    if TreeNode is Leaf:
        find nearest CFNode
    else:
        TreeNode = min(Dist(TreeNode.CFnode,传进来的簇))

4.到叶子节点后发现,不满足叶平衡因子,或计算的阈值超出了范围,则进行叶节点分裂。
5.叶节点分裂后,会增加分支节点上的CFNode增加,此时需要判断增加CFNode后的TreeNode是否满足分支平衡因子,如果不满足则当前分支节点进行分裂,同时上一层的分支节点进行CFNode数量增加。

#伪代码:
    # 计算叶节点是否要分裂,len(TreeNode)就是指CFNode的数量
    if len(TreeNode) < leaf_balance or Dist(CFNode,传入的簇) < threshold:
        TreeNode.add(CFNode)
    else:
        TreeNode.split()
        
        # 分裂后,判断上一层分支数量会不会超出
        @递归的函数 
        if len(TreeNode.parent) < branch_balance:
            TreeNode.parent.add(TreeNode)
        else:
            TreeNode = TreeNode.parent (开始上面的函数递归)
        

6.簇插入到叶子节点时候,需要更新当前插入路径下的聚类特征值,即L,SS,LS等
7.输出CF树,然后可以进行优化

4.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) 如果数据集的分布簇不是类似于超球体,或者说不是凸的,则聚类效果不好。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 姓名:梁祥学号:17021210935 【嵌牛导读】:层次聚类方法作为一种能够在一定程度上将聚类过程显化的聚类方法...
    Leon_66阅读 3,494评论 1 2
  • 机器学习是做NLP和计算机视觉这类应用算法的基础,虽然现在深度学习模型大行其道,但是懂一些传统算法的原理和它们之间...
    在河之简阅读 20,492评论 4 65
  • 任务统筹策略,就是给框架内的某样元素,分配一个新任务,并创造出一个新产品或者新服务。 让我最先想到的一个事情...
    合肥李风丽阅读 466评论 0 0
  • 在市区繁华的商业街, 我终于开了一家小店。 虽然店小却不影响它的特别, 我要把它打造成同行第一。 光看店的招牌就很...
    关又韦阅读 132评论 4 0
  • 寻一段远去,念一份情缘…… 过往裹挟着爱恋,情深缘浅,过往相偕有情调,初心向阳,初识清莹……怀旧!寻回印记里所有的...
    夏秋野菊阅读 335评论 0 3