四种常用聚类及代码(三):birch(一种层次聚类)

BIRCH是一种层次聚类算法,通过构建聚类特征树(CF Tree)来快速处理大规模数据。算法分为构建CF Tree和后续聚类两步,适合数据量大、类别数多的场景。CF由N(样本数)、LS(线性求和)、SS(平方和)组成,用于概括簇信息。BIRCH通过调整参数能处理离群点和内存限制,但对高维数据和非凸簇效果不佳。
摘要由CSDN通过智能技术生成


BIRCH,Balanced Iterative Reducing and Clustering Using Hierarchies,翻译过来就是“利用层次方法的平衡迭代规约和聚类“,全称非常复杂。

1、birch概述

简单来说,BIRCH 算法利用了一个树结构来帮助我们快速的聚类,这个特殊的树结构,就是我们后面要详细介绍的聚类特征树(CF-tree)。
可以说只要构造好了CF-树,BIRCH算法也就完成了。BIRCH算法比较适合于数据量大,类别数K也比较多的情况。它运行速度很快,只需要单遍扫描数据集就能进行聚类
该算法笼统的说,可以分为两步:
(1)扫描数据库,建立一棵存放于内存的 CF-Tree,它可以被看作数据的多层压缩,试图保留数据的内在聚类结构;
(2)采用某个选定的聚类算法,如 K-means或者凝聚算法,对CF树的叶节点进行聚类,把稀疏的簇当作离群点删除,而把更稠密的簇合并为更大的簇。

2、概念准备

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

2.1、 CF-Tree

CF-tree,Clustering Feature Tree,聚类特征树。

2.1.1、CF 聚类特征

CF聚类特征用一个三元组概括描述各簇的信息,每一个 CF 都可以用(N,LS,SS)表示。

CF聚类特征

假设某簇中有 N 个 D 维数据点
矢量 L S ⃗ \vec{LS} LS 是个各点的线性求和,公式如下:

∑ l ⃗ = ∑ n = 1 N x n ⃗ = ( ∑ n = 1 N x n 1 , ∑ n = 1 N x n 2 , . . . , ∑ n = 1 N x n D ) T \sum{\vec{l}} = \sum_{n=1}^N\vec{x_n} = {(\sum_{n=1}^Nx_{n1},\sum_{n=1}^Nx_{n2},...,\sum_{n=1}^Nx_{nD})}^T l =n=1Nxn =(n=1Nxn1,n=1Nxn2,...,n=1NxnD)T
标量 SS 是各数据点的平方和,公式如下:

∑ s = ∑ n = 1 N x n ⃗ 2 = ∑ n = 1 N x n ⃗ T x n ⃗ = ∑ n = 1 N ∑ i = 1 D x n i 2 \sum{s} = \sum_{n=1}^N{\vec{x_n}}^2 = \sum_{n=1}^N{\vec{x_n}}^T\vec{x_n} = \sum_{n=1}^N\sum_{i=1}^D{x_{ni}}^2 s=n=1Nxn 2=n=1Nxn Txn =n=1Ni=1Dxni2

可加性:
对于两个不相交的簇 C1 和 C2 ,
聚类特征分别为 CF1 = <N1, LS1, SS1> 和 CF2 = <N2, LS2, SS2> ,
如果将这两个簇合并成一个大簇,则大簇的聚类特征为:
CF1 + CF2 = <N1+N2, LS1+LS2, SS1+SS2>

2.1.2、CF的三个统计量

簇质心:
X 0 ⃗ = ∑ i = 1 N X i ⃗ N = L S N \vec{X_0} = \frac{\sum\limits_{i=1}^{N}\vec{X_i}}{N} = \frac{LS}{N} X0 =N

BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)天生就是为处理超大规模(至少要让你的内存容不下)的数据集而设计的,它可以在任何给定的内存下运行。关于BIRCH的更多特点先不介绍,我先讲一下算法的完整实现细节,对算法的实现过程搞清楚后再去看别人对该算法的评价才会感受深刻。 你不需要具备B树的相关知识,我接下来会讲得很清楚。 BIRCH算法的过程就是要把待分类的数据插入一棵树中,并且原始数据都在叶子节点上。这棵树看起来是这个样子: 在这棵树中有3种类型的节点:Nonleaf、Leaf、MinCluster,Root可能是一种Nonleaf,也可能是一种Leaf。所有的Leaf放入一个双向链表中。每一个节点都包含一个CF值,CF是一个元组,其中data point instance的个数,和是与数据点同维度的向量,是线性和,是平方和。比如有一个MinCluster里包含3个数据点(1,2,3),(4,5,6),(7,8,9),则 N=3, =(1+4+7,2+5+8,3+6+9)=(12,15,18), =(1+16+49,4+25+64,9+36+81)。 就拿这个MinCluster为例,我们可以计算它的 簇中心 簇半径 簇直径 我们还可以计算两个簇之间的距离,当然你也可以使用D0,D1,D3等等,不过在这里我们使用D2。 有意思的是簇中心、簇半径、簇直径以及两簇之间的距离D0到D3都可以由CF来计算,比如 簇直径 簇间距离,这里的N,LS和SS是指两簇合并后大簇的N,LS和SS。所谓两簇合并只需要两个对应的CF相加那可 CF1 + CF2 = (N1 + N2 , LS1 + LS2, SS1 + SS2) 每个节点的CF值就是其所有孩子节点CF值之和,以每个节点为根节点的子树都可以看成 是一个簇。 Nonleaf、Leaf、MinCluster都是有大小限制的,Nonleaf的孩子节点不能超过B个,Leaf最多只能有L个MinCluster,而一个MinCluster的直径不能超过T。 算法起初,我们扫描数据库,拿到第一个data point instance--(1,2,3),我们创建一个空的Leaf和MinCluster,把点(1,2,3)的id值放入Mincluster,更新MinCluster的CF值为(1,(1,2,3),(1,4,9)),把MinCluster作为Leaf的一个孩子,更新Leaf的CF值为(1,(1,2,3),(1,4,9))。实际上只要往树中放入一个CF(这里我们用CF作为Nonleaf、Leaf、MinCluster的统称),就要更新从Root到该叶子节点的路径上所有节点的CF值。 当又有一个数据点要插入树中时,把这个点封装为一个MinCluster(这样它就有了一个CF值),把新到的数据点记为CF_new,我们拿到树的根节点的各个孩子节点的CF值,根据D2来找到CF_new与哪个节点最近,就把CF_new加入那个子树上面去。这是一个递归的过程。递归的终止点是要把CF_new加入到一个MinCluster中,如果加入之后MinCluster的直径没有超过T,则直接加入,否则譔CF_new要单独作为一个簇,成为MinCluster的兄弟结点。插入之后注意更新该节点及其所有祖先节点的CF值。 插入新节点后,可能有些节点的孩子数大于了B(或L),此时该节点要分裂。对于Leaf,它现在有L+1个MinCluster,我们要新创建一个Leaf,使它作为原Leaf的兄弟结点,同时注意每新创建一个Leaf都要把它插入到双向链表中。L+1个MinCluster要分到这两个Leaf中,怎么分呢?找出这L+1个MinCluster中距离最远的两个Cluster(根据D2),剩下的Cluster看离哪个近就跟谁站在一起。分好后更新两个Leaf的CF值,其祖先节点的CF值没有变化,不需要更新。这可能导致祖先节点的递归分裂,因为Leaf分裂后恰好其父节点的孩子数超过了B。Nonleaf的分裂方法与Leaf的相似,只不过产生新的Nonleaf后不需要把它放入一个双向链表中。如果是树的根节点要分裂,则树的高度加1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值