【算法推荐】层次聚类算法BIRCH及其实现

 

利用层次结构的平衡迭代归约和聚类(Balanced Iterative Reducing and Clustering usingHierarchies, BIRCH)是为大量数值数据聚类设计的,它将层次聚类(在初始微聚类阶段)与诸如迭代地划分这样的其他聚类算法(在其后的宏聚类阶段)集成在一起。它克服了凝聚聚类方法所面临的两个困难: (1)可伸缩性; (2)不能撤销先前步骤所做的工作。

 

BIRCH使用聚类特征来概括一个簇,使用聚类特征树(CF-树)来表示聚类的层次结构。这些结构帮助聚类方法在大型数据库甚至在流数据库中取得好的速度和伸缩性,还使得BIRCH方法对新对象增量或动态聚类也非常有效。

 

一、聚类特征(Clustering Feature, CF)

 

聚类特征(CF)是一个三元组,给出对象子类的信息的汇总描述。设某个子类中有N个d维的点或对象,则该子类的CF定义如下:

 

 

如下,计算三元组聚类特征的例子:

 

 

  • 统计学的观点来看,聚类特征是对给定子类统计汇总:子聚类的0阶,1阶和 2阶矩( moments ) 

     

  • 记录了计算聚类和有效利用存储的关键度量,并有效地利用了存储,因为它汇总了关于子类的信息,而不是存储所有的对象

 

二、聚类特征树(Clustering Feature Tree, CF树)

 

  • CF 树是高度平衡的树,它存储了层次聚类的聚类特征

  1. 树中的非叶节点有后代或“孩子”

  2. 非叶节点存储了其孩子的CF的总和,即汇总了关于其孩子的聚类信息

 

  • CF树有两个参数:影响CF树的大小

  1. 分支因子B:定义非树叶节点的孩子的最大个数

  2. 阈值T:  给出了存储在树的叶子节点中的子类的最大直径

 

CF树实例如下:

 

三、BIRCH构建CF树

 

BIRCH增量地构造CF树,构造一棵CF树主要包括以下两个阶段:

 

  • 阶段1:扫描DB, 建立一棵初始的存放在内存的CF树(数据的多层压缩,试图保留数据内在的聚类结构)

  • 阶段2:使用某种聚类算法对CF树的叶节点进行聚类

 

在阶段一,BIRCH动态地构建CF树。一个对象被插入到最近的叶子条目(子聚类). 如果在插入后存储在叶子节点中的子类的直径大于阀值,那么该叶子节点(可能还有其他节点)被分裂. 新对象插入后. 关于该对象的信息向着树根传递,类似于B+树构建中的插入和节点分裂。通过修改阀值,CF树的大小可以改变。重建过程从旧树的叶子节点建造一个新树。这样,重建树的过程不需要重读所有的对象,建树只需读一次数据。

 

在阶段二可以采用任意地聚类方法,例如典型地划分方法。

 

四、BIRCH的性能

 

  • 优点:

  1. 支持增量聚类

  2. 线性可伸缩性:计算复杂性O(n),单遍扫描,附加的扫描可以改善聚类质量

  3. 较好的聚类质量

     

  • 缺点:

  1. 只能处理数值数据

  2. 对数据的输入次序敏感

  3. CF树结点不总是对应于[用户考虑的]自然簇(参数B和T)

  4. 非球形时效果不好(使用半径/直径控制簇边界)

 

五、Python实现代码

 

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import Birch
from sklearn import metrics

##############################################
#                     生成数据
##############################################
# X为样本特征,Y为样本簇类别
# 共1000个样本,每个样本2个特征
# 共4个簇,簇中心在[-1,-1], [0,0],[1,1], [2,2]
# 每个类别的方差分别为0.4, 0.3, 0.4, 0.3
X, y = make_blobs(n_samples=1000, n_features=2, 
	centers = [[-1,-1], [0,0], [1,1], [2,2]], 
	cluster_std = [0.4, 0.3, 0.4, 0.3], random_state=9)

##############################################
#                     开始聚类
##############################################
# 尝试多个threshold取值,和多个branching_factor取值
param_grid = {'threshold': [0.1, 0.3, 0.5],
'branching_factor': [10, 20, 50]}  
CH_all = []
X_all = []
y_all = []
paras_all = []
# 网格搜索方法
print("Threshold\tBranching factor\tMetrics")
for threshold in param_grid['threshold']:
    for branching_factor in param_grid['branching_factor']:
        clf = Birch(n_clusters = 4, 
        	threshold = threshold, branching_factor = branching_factor)
        clf.fit(X)
        X_all.append(X)
        y_pred = clf.predict(X)
        y_all.append(y_pred)
        CH = metrics.calinski_harabaz_score(X, y_pred)
        CH_all.append(CH)
        paras_all.append([threshold, branching_factor])
        print(threshold, "\t", branching_factor, "\t", '%.4f'%CH)

##############################################
#                     择优
##############################################
CH_max = max(CH_all)
idx = CH_all.index(CH_max)
X_max = X_all[idx]
y_max = y_all[idx]

##############################################
#                     绘图
##############################################
plt.rcParams['font.sans-serif'] = ['Times New Roman']
plt.rcParams['axes.unicode_minus'] = False

plt.figure()
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], marker = 'o', c = y)
plt.title('Original Cluster Plot')
plt.xlabel('(1)')

plt.subplot(1, 2, 2)
plt.scatter(X_max[:, 0], X_max[:, 1], marker = 'o', c = y_max)
plt.title('Result (Threshold = ' + str(paras_all[idx][0])
 + ', BF = ' + str(paras_all[idx][1]) + ')')
plt.xlabel('(2)')


plt.show()

 

六、实验结果

 

本殿下使用sklearn 中 make_blobs模块随机生成实验数据,使用Python 3.7软件在配备为 Intel (R) Core (TM) i7-7500U 2.90 GHz CPU 和 8GB 内存的个人电脑上进行了本文的实验。

 

采用网格搜索方法,设置两个参加Threshold和Branching factor,分别得到Calinski-Harabasz 分数如下:

 

表1:网格搜索结果

Index

Threshold

Branching factor

Metrics (CH)

1

0.1

 10

 3067.5849

2

0.1

 20

 2997.3023

3

0.1

 50

 2155.1002

4

0.3

 10

 2800.8784

5

0.3

 20

 3301.8023

6

0.3

 50

 3295.6349

7

0.5

 10

 2816.4077

8

0.5

 20

 2816.4077

9

0.5

 50

 2816.4077

注:CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。

 

绘制出原始数据与聚类结果如下:

 

图1:预测结果:(1)为随机生成的数据,(2)为聚类结果(threshold=0.3,branching_factor = 20)

 

参考文献

 

  1. Jiawei Han, Micheline Kamber & Jian Pei. Data Miining Concepts and Techniques (Third Edition). 

     

  2. 范明,孟小峰译. 数据挖掘:概念和技术(第三版).

     

  3. Tian Zhang, Raghu Ramakrishnan & Miron Livny. BIRCH: an efficient data clustering method for very large databases. ACM SIGMOD Record, 1996, 25(2): 103-144. 【点击阅读原文即可获取本论文】

 

大家都在看

 

☞【数据挖掘笔记】度量数据的相异性和相似性

☞【数据挖掘笔记】四大聚类方法

☞【数据挖掘笔记】K-均值聚类

☞【数据挖掘笔记】聚类分析的评价标准

☞【算法推荐】k-means++

 

 

觉得好看,请点这里

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值