Birch算法

Birch算法

Birch概述

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

聚类特征CF

聚类特征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)

簇的质心和簇的半径

假如一个簇中包含n个数据点:{Xi},i=1,2,3…n,则质心C和半径R计算公式如下:
C=(X1+X2+…+Xn)/n,(这里的x1+X2+…+Xn是向量相加)
R=(|X1-C|2+|X2-C|2+…+|Xn-C|^2)/n
簇半径表示簇中所有点到质心得平均距离

聚类特征树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 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有一个很好的性质,就是满足线性关系,CF1+CF2=(N1+N2,LS1+LS2,SS1+SS2)。这个性质从定义也很好理解。如果把这个性质放在CF Tree上,也就是说,在CF Tree中,对于每个父节点中的CF节点,它的(N,LS,SS)三元组的值等于这个CF节点所指向的所有子节点的三元组之和。如右图所示
在这里插入图片描述
对于CF树有3个重要参数:
第一个参数是每个内部节点的最大CF数B;
第二个参数是每个叶子节点的最大CF数L;
第三个参数是针对叶子节点中某个CF中的样本点来说的,它是叶节点每个CF的最大样本半径阈值T;就是说,在这个CF中的所有样本点一定要在半径小于T的一个超球体内。
对于右图中的CF Tree,限定了B=6, L=5, 也就是说内部节点最多有6个CF,而叶子节点最多有5个CF

Birch算法

BIRCH算法主要包含以下四个步骤:
(1) 扫描整个数据集,将数据依次插入,逐步构建起一个初始的CF树(聚类特征树),如果在插入的过程中遇到内存不足的情况,则提升阈值,在先前的CF树基础之上重新构建一个较小的树,满足内存需求。建树完成后,将集中的样品点划分为一类,零星的离散点当做是孤立点或噪声点。
(2)二次聚类。在步骤(1)中,数据样品总是被插入到距离其最近的叶节点(簇)中,并且一旦将其插入成功,更新其父节点的CF值状态,同时该数据的信息也会自下而上传到root节点中;如果不能正常插入,即叶节点(簇)半径大于先前设定的阈值,此叶节点将要被分裂——新数据的插入和分裂的过程基本类似于构建B+树的过程。如果过程中内存占用过大,就按照步骤(1)中的办法,通过调节阈值改变树的大小重新建树,需要注意的是,这里重建特征树的时候不需要再次扫描整个数据集,而是在已存在的特征树的叶节点基础之上重新构建,由此可知,整个建树的过程只需要扫描一次数据集。
(3)这个步骤是可选的。在步骤(1)、(2)中可能会存在由于由于输入顺序和页
面大小大带来的分裂。使用全局/半全局聚类算法对所有叶节点重新聚类来补救先
前的分裂,提升现有聚类结果的质量
(4) 这个步骤是可选的。将数据重新划分到最近的中心点附近,这里的中心
点为步骤(3)中的中心点,以确保重复数据被分到同一个叶节点(簇)中,同时可以
添加簇标签。
在这里插入图片描述
BIRCH算法的主要优点有:

  1. 节约内存,所有的样本都在磁盘上,CF Tree仅仅存了CF节点和对应的指针。
  2. 聚类速度快,只需要一遍扫描训练集就可以建立CF Tree,CF Tree的增删改都很快。
  3. 可以识别噪音点,还可以对数据集进行初步分类的预处理

BIRCH算法的主要缺点有:

  1. 由于CF Tree对每个节点的CF个数有限制,导致聚类的结果可能和真实的类别分布不同.
  2. 对高维特征的数据聚类效果不好。此时可以选择Mini Batch K-Means
  3. 如果数据集的分布簇不是类似于超球体,或者说不是凸的,则聚类效果不好。

实验

数据集
在这里插入图片描述

#%%

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#%%

dataset = pd.read_csv('Loans.csv')

#%%

dataset

#%% md

Getting the data as in below.

#%%

X = dataset.iloc[:, 1:4]
y = dataset.loc[:, 'Approval']

#%%

print('type check: \nX: {}\ny: {}'.format(type(X), type(y)))
X.shape

#%% md

## Modeling

#%%

# splitting
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=100)

#%% md

Standardizing the features is applied in order to gather variables in the same scaling level.

#%%

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train_scaled = sc.fit_transform(X_train)
X_test_scaled = sc.transform(X_test)

#%%

#训练和测试数据
from sklearn.cluster import Birch
brc = Birch(threshold=0.5, n_clusters=None, branching_factor=50)
birch_model = brc.fit(X_train_scaled)
labels = brc.predict(X_test_scaled)
# result
n_clusters = np.unique(labels).size
plt.scatter(X_test_scaled[:,0], X_test_scaled[:,1],c=labels)
plt.show()

BIRCH类参数

  1. threshold:即叶节点每个CF的最大样本半径阈值T,它决定了每个CF里所有样本形成的超球体的半径阈值。一般来说threshold越小,则CF Tree的建立阶段的规模会越大,即BIRCH算法第一阶段所花的时间和内存会越多。但是选择多大以达到聚类效果则需要通过调参决定。默认值是0.5.如果样本的方差较大,则一般需要增大这个默认值。

  2. branching_factor:即CF Tree内部节点的最大CF数B,以及叶子节点的最大CF数L。这里scikit-learn对这两个参数进行了统一取值。也就是说,branching_factor决定了CF Tree里所有节点的最大CF数。默认是50。如果样本量非常大,比如大于10万,则一般需要增大这个默认值。选择多大的branching_factor以达到聚类效果则需要通过和threshold一起调参决定

  3. n_clusters:即类别数K,在BIRCH算法是可选的,如果类别数非常多,我们也没有先验知识,则一般输入None,此时BIRCH算法第4阶段不会运行。但是如果我们有类别的先验知识,则推荐输入这个可选的类别值。默认是3,即最终聚为3类。

聚类的结果
在这里插入图片描述

参考博客

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值