【Python】sklearn机器学习之Birch聚类算法

基本原理

BIRCH,即Balanced Iterative Reducing and Clustering Using Hierarchies,利用分层的平衡迭代规约和聚类,特点是扫描一次数据就可以实现聚类,

而根据经验,一般这种一遍成功的算法,背后一定有一棵树,而这棵树的生成规则,往往就是算法的核心。Birch算法的核心,叫做聚类特征树(Clustering Feature Tree),简称CF树。

CF树由CF构成,每个CF都是三元组,表示为(N, LS, SS),其中N表示点数;LS表示点的向量和;SS表示CF各分量的平方和。

CF树常见的操作有两个,分别是添加样本点和CF分裂。而一个新的样本点到来之后,是融入现有的CF,还是另行开辟一个新的CF,则要受到至少两个参数的约束:

  1. 最大CF数
  2. 每个CF的最大样本半径

sklearn调用

sklearn中,Birch类的构造函数如下

Birch(*, threshold=0.5, branching_factor=50, n_clusters=3, compute_labels=True, copy=True)

其中

  • threshold表示CF最大样本半径,当新的样本加入到某个CF中后,如果大于threshold,则会发生CF分裂。
  • branching_factor 表示每个节点的最大CF个数

考虑到Birch适用于较大样本数量,所以下面

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

xs, ys = np.indices([10,10])*5
n_centers = np.array(list(zip(xs.reshape(-1), ys.reshape(-1))))
X, y = make_blobs(n_samples=25000, centers=n_centers, random_state=0)
birch = Birch(threshold=1.7, n_clusters=None)
birch.fit(X)
plt.scatter(X[:,0], X[:,1], c=birch.labels_, marker='.')
plt.show()

效果为

在这里插入图片描述

貌似效果不太好,主要原因可能是没预设样本数,

birch = Birch(threshold=1.7, n_clusters=100)
birch.fit(X)
plt.scatter(X[:,0], X[:,1], c=birch.labels_, marker='.')
plt.show()

n_cluster设为100之后,效果为

在这里插入图片描述

接下来测试一下Birch算法的效率,通过make_blobs生成10万个点,然后通过Birch算法完成聚类

import time
X, y = make_blobs(n_samples=100000, centers=n_centers, random_state=0)
t = time.time()
birch = Birch(threshold=1.7, n_clusters=100)
birch.fit(X)
print(time.time()-t)
plt.scatter(X[:,0], X[:,1], c=birch.labels_, marker='.')
plt.show()

耗时2.79s,聚类结果为
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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。
### 回答1: 以下是BIRCH聚类算法的伪代码表示: ``` 1. 初始化BIRCH树的参数,包括阈值T和分支因子B。 2. 读入数据集,并将其划分为多个内存可容纳的子集。 3. 对每个子集进行以下操作: a. 读入数据并生成一个CF树。 b. 将CF树插入到BIRCH树中。 4. 对BIRCH树进行以下操作: a. 获取BIRCH树的根节点。 b. 递归地遍历BIRCH树,将每个CF节点合并成一个或多个聚类。 5. 输出聚类结果。 ``` 其中,CF树是一种基于层次结构的树形结构,用于高效地存储和聚类大规模数据集。BIRCH树是基于CF树的一种聚类方法,它使用了CF树的层次结构和节点聚合操作,将大规模数据集分层聚类成多个紧凑的聚类。 ### 回答2: BIRCH聚类算法的伪代码表示如下: 输入:数据集D,聚类阈值T,分裂阈值T' 输出:聚类数C,聚类结果C 1. 初始化:将D中的每个数据点作为一个叶节点 2. 初始化:设置C和C为空 3. 对于每个数据点x in D: 1. 在C中找到距离x最近的聚类中心C_i,计算x到C_i的距离dist 2. 如果dist <= T,则将x添加到C_i中 3. 否则,为x创建一个新的聚类中心C_i,并将x添加到C_i中 4. 对于每个聚类中心C_i in C: 1. 如果C_i中的数据点个数超过T': 1. 将C_i进行分裂,产生子节点C_{i1}, C_{i2},并将C_i中的数据点分配给C_{i1}和C_{i2} 2. 将C_{i1}和C_{i2}添加到C中,同时从C中删除C_i 5. 输出C中的聚类数C和聚类结果C BIRCH聚类算法中的关键思想是通过构建聚类特征树来进行高效的聚类。该算法首先将每个数据点作为一个叶节点,然后逐个遍历数据点,并将其分配到与其最近的聚类中心。如果数据点与聚类中心的距离超过了聚类阈值T,则会为该数据点创建一个新的聚类中心。然后,算法检测每个聚类中心中的数据点个数是否超过分裂阈值T',如果超过,则将该聚类中心进行分裂,产生新的子节点,并将原来的数据点重新分配到子节点中。最后,算法输出聚类数和聚类结果。 BIRCH聚类算法具有低时间复杂度和高效性的特点,适用于处理大规模数据集。 ### 回答3: BIRCH聚类算法是一种用于处理大规模数据集的聚类算法。以下是BIRCH算法的伪代码表示: 输入:数据集D,阈值T 1. 初始化一个B树根节点Root,并设定初始样本数N=0 2. 对于数据集D中的每个样本点x: 2.1 如果B树为空,则将x直接插入作为新的叶节点 2.2 否则,找到B树中最近的叶节点L,将x和L的样本点进行比较: - 如果L中的样本数小于阈值T,则将x插入到L中 - 如果L中的样本数大于等于阈值T,则计算x和L的距离 - 如果x和L的距离小于T,则将x插入到L中 - 如果x和L的距离大于等于T,则创建一个新的叶节点,并将x插入到新的叶节点中 3. 重复步骤2直到数据集中的所有样本点都被处理 4. 对B树中的每个叶节点L: 4.1 如果L中的样本点数小于阈值T,则将L合并到其它叶节点中 4.2 否则,将L作为一个簇返回 输出:聚类结果,即由合并后的叶节点组成的簇集合 BIRCH聚类算法的核心思想是使用B树来对数据集进行高效存储和检索,通过不断比较样本点的距离来构建聚类簇。这个伪代码表示了BIRCH算法的基本步骤,通过迭代处理数据集中的样本点,并将其分配到合适的叶节点或创建新的叶节点,最后再对叶节点进行合并以得到最终的聚类结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值