常见聚类算法及使用--均衡的迭代并减少聚类中心的层次聚类(BIRCH)

2023-11-09

前言

前面文章给大家介绍了 关于层次聚类算法的实现,那么本文给大家继续介绍层次聚类的优化算法 BIRCH

大家都知道像 K-means 这样的聚类算法比较有局限性,而且在大数据场景下很难处理,特别是在有限的内存和较慢的CPU硬件条件下。我相信这样的情况常规的聚类算法都没有办法确保随着数据量的不断增加而保证很好的聚类的质量和高效的运行时间。于是 BIRCH 应运而生: Balanced Iterative Reducing and Clustering using Hierarchies (BIRCH) 是一种应用层次聚类方法将大数据场景下的样本首先生成较小而且紧凑的类簇,并且这写类簇能够保留更可能多的信息。通过生成这样的一些关键的聚类信息,因此 BIRCH 也常被用作其它聚类算法的启蒙。
然而它也有一个主要的缺陷–它只能处理数值型数据。

算法实现

BIRCH的核心

BIRCH 算法有两个核心概念需要先了解一下:

Clustering Feature (CF)

BIRCH 会将大数据集初始化成多个小型的数据簇,这些构成密集区域的数据叫做 簇特征条目(Clustering Feature entries),每一条簇特征是有一个三元组数据构成: ( N , L S , S S ) (N, LS, SS) (N,LS,SS) N N N 表示当前簇中样本点的数量, L S LS LS 表示簇中样本点的线性加和,例如: ∑ i = 1 N X i \sum_{i=1}^N X_i i=1NXi S S SS SS 表示当前簇中样本点的平方和,例如: ∑ i = 1 N X i 2 \sum_{i=1}^N X_i^2 i=1NXi2
同时,每一个簇特征条目很有可能是其它簇特征条目的组成部分,这个说法在论文里面是有被提到,叫做 CF Aditivity Theorem (CF 可加定理) ,这个定理被证明:两个相近的簇,它们的 CF 分别用 C F 1 = ( N 1 , L S 1 , S S 1 ) CF1=(N_1, LS_1,SS_1) CF1=(N1,LS1,SS1) C F 2 = ( N 2 , L S 2 , S S 2 ) CF_2=(N_2, LS_2, SS_2) CF2=(N2,LS2,SS2) 表示,那么由这两个相近的簇组成的新簇的 CF 可表示为: C F = ( N 1 + N 2 , L S 1 + L S 2 , S S 1 + S S 2 ) CF=(N_1+N_2, LS_1+LS_2, SS_1+SS_2) CF=(N1+N2,LS1+LS2,SS1+SS2)

Clustering Feature Tree (CF Tree)

CF Tree 实际上就是 CF 的一种紧凑的表示方式,它是一种叶子结点包含一个子簇的树状结构。
CF Tree 中的每一个 CF entry 都包含一个指向子节点的指针,每个节点的 CF entry 由它指向的子节点所包含的所有子簇的 CF entry 的加和组成。
当然了,每个叶子节点中包含的 CF entry 的数目是有限制的,每个非叶子节点最多包含的 CF entry 同样也是有约束的,在后面的 API 参数中会介绍到。
在论文中,对于 CF Tree 是这样描述的:

A CF tree is a height-balanced tree with two parameters: branching factor B and threshold T.

BIRCH 构建 CF tree 的过程如下:
111
关于 CF tree 如何利用有限的 memory 完成对大数据集的聚类,以及如何有效的区分异常值,大致过程如下,详细的过程说明大家可以根据文末的链接阅读相关论文:
222

API及其参数

本文以 scikit-learnBIRCHAPI 实现为例:

class sklearn.cluster.Birch(*, threshold=0.5, branching_factor=50, n_clusters=3, compute_labels=True, copy=True)
  • threshold:通过合并新样本得到的子簇的半径和距离最近的子簇的半径必须小于这个值,否则会新建一个子簇。如果这个值设的非常小,那么会促进叶子节点继续分裂,反之亦然。默认值为 0.5。
  • branching_factor:每个子节点所包含的最大 CF 子簇的个数。如果超过了这个值,则节点会分裂(包含的子簇重新分配)成两部分。默认值为 50。
  • n_clusters:最终聚类得到的类簇个数。默认值为 3。如果设为 None,聚类的最后一步不会执行,会返回聚类的中间结果。
案例实现
构造样本
  # 综合分类数据集
  import numpy as np
  from sklearn.datasets import make_blobs
  from matplotlib import pyplot as plt

  # 创建数据集
  # X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,
  # 簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2, 0.2]
  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.2, 0.1],
                  random_state=9)
  # 数据可视化
  plt.scatter(X[:, 0], X[:, 1], marker='o')
  plt.show()

展示结果如下:
333
实例化API完成对样本的聚类:

from sklearn.cluster import Birch

# Creating the BIRCH clustering model
model = Birch(branching_factor = 50, n_clusters = 4, threshold = 0.8)
 
# Fit the data (Training)
model.fit(X)
 
# Predict the same data
pred = model.predict(X)
 
# Creating a scatter plot
plt.scatter(X[:, 0], X[:, 1], c = pred, cmap = 'rainbow', alpha = 0.7, edgecolors = 'b')
plt.show()

展示效果如下:
555
这个参数是我调整过的,大家可以继续在这个基础上进行微调,以达到更好的聚类效果。
最后,BIRCH 聚类后的结果可以当做其它聚类算法的输入,比如 AgglomerativeClustering ,大家可以根据需要自行尝试。

参考文献
  1. https://www.cs.sfu.ca/CourseCentral/459/han/papers/zhang96.pdf
  2. https://scikit-learn.org/stable/modules/generated/sklearn.cluster.Birch.html
  3. https://www.geeksforgeeks.org/ml-birch-clustering/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见聚类算法及使用--均衡的迭代并减少聚类中心的层次聚类(BIRCH) 的相关文章

随机推荐

  • 计蒜客T1437——最大值和次大值

    比较简单的题 用STL库可以大幅度降低代码复杂度 将int型的数字压入到vector中 调用sort实现从小到大排序 再采用reverse将其翻转为从大到小 将第一个元素 最大值 首先输出 再遍历后面第一个与最大值不同的元素 其即为题干要求
  • Jmeter性能测试

    一 介绍 JMeter是一款测试工具 主要用于服务端的性能测试 如web网站 api服务器等 可以方便的获取来自不同压力下的性能指标 另外 JMeter能够对应用程序做功能 回归测试 通过创建带有断言的脚本来验证返回结果是否符合期望 二 安
  • 海思3861L搭建Linux开发环境基于ubuntu16.04

    1 拷贝工具链hcc riscv32 tar gz压缩包到ubuntu系统解压并新增环境变量 如下所示 vim etc profile export PATH toolchain hcc riscv32 bin PATH source et
  • 字符串分割QString::split

    同样是字符串分割 split 和section 相比不同之处在于前者将分割内容以list返回 split 有多种重载形式 QStringList QString split QChar sep QString SplitBehavior b
  • RocketMQ Pull和Push

    在rocketmq里 consumer被分为2类 MQPullConsumer和MQPushConsumer 其实本质都是拉模式 pull 即consumer轮询从broker拉取消息 区别是 push方式里 consumer把轮询过程封装
  • 【车道线检测】计算机视觉视频车道线检测 【含GUI Matlab源码 362期】

    一 Hough变换图片车道线检测简介 1 引言 随着人们生活水平的提高 科技的不断进步 智能驾驶技术逐渐受到了研究者们的广泛研究和关注 先进驾驶辅助系统 Advanced Driver Assistance System 简称ADAS 是智
  • 云函数请求第三方API

    云函数请求第三方API 构建环境 在云开发文件目录下通过npm 安装插件 request 和 request promise npm install save request npm install save request promise
  • Java 单元测试(3)mock进阶 - 静态、final、私有方法mock

    mock进阶 前言 1 powerMock 1 1 powerMock官方文档 1 2 powerMock demo模拟 2 JMockit 2 1 jmockit demo 2 2 Mocked 2 3 Injectable 2 4 Te
  • dnf连接服务器黑屏xp系统,xp系统开机黑屏的解决办法

    xp系统开机黑屏的解决办法 有些用户在使用XP系统时 有时候操作失误导致XP系统开机时黑屏 有开机声音 但是屏幕无显示 这是什么原因呢 其实这是因为你使用电脑是不小心更改了分辨率 一般更改了分辨率 如果分辨率超限 win7系统会自动恢复最低
  • python 关闭redis连接

    python读写redis时 到底需不需要关闭redis连接池连接 import redis def RedisUtils pool redis ConnectionPool host 172 8 10 145 port 6379 pass
  • Android Camera HAL3中预览preview模式下的控制流

    本文均属自己阅读源码的点滴总结 转账请注明出处谢谢 欢迎和大家交流 qq 1037701636 email gzzaigcn2009 163 com Software 系统源码Android5 1 Camera3研读前沿 当初在研读Came
  • 焦距物距像距图解 示意图_自制小孔成像装置 鞋盒DIY简单小孔成像制作图解

    两千多年前 我国的学者墨子和他的学生 做了世界上第一个小孔成像的实验 他的做法是 在一间黑暗的屋子里 一面墙上开一个小孔 小孔对面的墙上就会出现外面景物的倒像 我们要重复这个实验 当然不需要专门造一间没有窗户的屋子 甚至不需要任何专门的器材
  • 13种架构设计模式(常用)

    13种常用架构设计模式 适配器模式 策略模式 观察者模式 原型 外观模式 装饰模式 工厂模式 抽象工厂模式 桥接模式 代理模式 单例模式 备忘录模式 生成器模式 命令模式 组合模式
  • UE4透明粒子距离场碰撞随机分布解决方案

    由于景深碰撞不能应用于透明物体 因此试了一下UE4的距离场碰撞 效果还可以接受 但是发现发射器的Collision中Random Spread和Random Distribution参数都失效了 粒子只能按照法线做反弹 检查源码发现Coll
  • 【2022年高教杯数学建模】C题:古代玻璃制品的成分分析与鉴别方案及代码实现(二)

    问题二 根据附件数据分析高钾玻璃 铅钡玻璃的分类规律 对于每个类别选择合适的化学成分对其进行亚类分析 给出具体的划分方法以及划分结果 并对分类结果的合理性和敏感性进行分析 1 问题2的分析 题目要求我们探究高钾玻璃和铅钡玻璃的分类规律 并对
  • DOM元素三大系列

    offset元素偏移量 获取元素距离带有定位父元素的位置 获取元素自身的大小 宽度高度 返回的数组不带单位 offset常用属性 element offsetParent 返回作为该元素带有定位的父级元素 如果父级没有定位则返回body e
  • The Standard Template Library___CH_21

    21 1 The Standard Library The Standard Library The Standard library contains a collection of classes that provide templa
  • c#获取MySql表中数据

    using MySql Data MySqlClient 引入MySql Data dll public static Dictionary
  • 从原理聊JVM(一):染色标记和垃圾回收算法

    1 JVM运行时内存划分 1 1 运行时数据区域 方法区 属于共享内存区域 存储已被虚拟机加载的类信息 常量 静态变量 即时编译器编译后的代码等数据 运行时常量池 属于方法区的一部分 用于存放编译期生成的各种字面量和符号引用 JDK1 8之
  • 常见聚类算法及使用--均衡的迭代并减少聚类中心的层次聚类(BIRCH)

    前言 前面文章给大家介绍了 关于层次聚类算法的实现 那么本文给大家继续介绍层次聚类的优化算法 BIRCH 大家都知道像 K means 这样的聚类算法比较有局限性 而且在大数据场景下很难处理 特别是在有限的内存和较慢的CPU硬件条件下 我相