Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用scikit-learn学习BIRCH聚类

用scikit-learn学习BIRCH聚类

作者头像
刘建平Pinard
发布于 2018-08-14 03:45:59
发布于 2018-08-14 03:45:59
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

    在BIRCH聚类算法原理中,我们对BIRCH聚类算法的原理做了总结,本文就对scikit-learn中BIRCH算法的使用做一个总结。

1. scikit-learn之BIRCH类

    在scikit-learn中,BIRCH类实现了原理篇里讲到的基于特征树CF Tree的聚类。因此要使用BIRCH来聚类,关键是对CF Tree结构参数的处理。

    在CF Tree中,几个关键的参数为内部节点的最大CF数B, 叶子节点的最大CF数L, 叶节点每个CF的最大样本半径阈值T。这三个参数定了,CF Tree的结构也基本确定了,最后的聚类效果也基本确定。可以说BIRCH的调参就是调试B,L和T。

    至于类别数K,此时反而是可选的,不输入K,则BIRCH会对CF Tree里各叶子节点CF中样本的情况自己决定类别数K值,如果输入K值,则BIRCH会CF Tree里各叶子节点CF进行合并,直到类别数为K。

2. BIRCH类参数

    在scikit-learn中,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类。

    4)compute_labels:布尔值,表示是否标示类别输出,默认是True。一般使用默认值挺好,这样可以看到聚类效果。

    在评估各个参数组合的聚类效果时,还是推荐使用Calinski-Harabasz Index,Calinski-Harabasz Index在scikit-learn中对应的方法是metrics.calinski_harabaz_score.

3. BIRCH运用实例

    这里我们用一个例子来学习BIRCH算法。

    首先,我们载入一些随机数据,并看看数据的分布图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,簇中心在[-1,-1], [0,0],[1,1], [2,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.4, 0.3], 
                  random_state =9)
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()

    输出图如下:

    现在我们用BIRCH算法来聚类,首先我们选择不输入可选的类别数K,看看聚类效果和Calinski-Harabasz 分数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.cluster import Birch
y_pred = Birch(n_clusters = None).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
from sklearn import metrics
print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred) 

    输出图如下:

    对应的Calinski-Harabasz 分数输出为:

Calinski-Harabasz Score 2220.95253905

    由于我们知道数据是4个簇随机产生的,因此我们可以通过输入可选的类别数4来看看BIRCH聚类的输出。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
y_pred = Birch(n_clusters = 4).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred) 

    输出图如下:  

    对应的Calinski-Harabasz 分数输出为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Calinski-Harabasz Score 2816.40765268     

    可见如果我们不输入类别数的话,在某些时候BIRCH算法的聚类效果并不一定好,因此这个可选的类别数K一般还是需要调参的。

    对于threshold和branching_factor我们前面还没有去调参,使用了默认的threshold值0.5和默认的branching_factor值50.

    现在我们将threshold从0.5降低为0.3,让BIRCH算法第一阶段的CF Tree规模变大,并观察Calinski-Harabasz 分数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
y_pred = Birch(n_clusters = 4, threshold = 0.3).fit_predict(X)
print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred) 

    对应的Calinski-Harabasz 分数输出为:

Calinski-Harabasz Score 3295.63492273

    可见此时的聚类效果有了进一步的提升,那么是不是threshold越小越好呢?我们看看threshold从0.3降低为0.1时的情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
y_pred = Birch(n_clusters = 4, threshold = 0.1).fit_predict(X)
print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred) 

    对应的Calinski-Harabasz 分数输出为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Calinski-Harabasz Score 2155.10021808

    也就是说threshold不是越小聚类效果越好。

    我们基于threshold为0.3的情况,调试下branching_factor,将branching_factor从50降低为20.让BIRCH算法第一阶段的CF Tree规模变大。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
y_pred = Birch(n_clusters = 4, threshold = 0.3, branching_factor = 20).fit_predict(X)
print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred) 

    对应的Calinski-Harabasz 分数输出为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Calinski-Harabasz Score 3301.80231064

    可见调试branching_factor也可以让聚类分数提高。那么和threshold类似,是不是branching_factor越小越好呢?我们将branching_factor从20降低为10,观察聚类分数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
y_pred = Birch(n_clusters = 4, threshold = 0.3, branching_factor = 10).fit_predict(X)
print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred) 

    对应的Calinski-Harabasz 分数输出为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Calinski-Harabasz Score 2800.87840962

    也就是说和threshold类似,branching_factor不是越小聚类效果越好,需要调参。

    以上就是BIRCH算法的一些经验,希望可以帮到朋友们。

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-12-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聚类︱python实现 六大 分群质量评估指标(兰德系数、互信息、轮廓系数)
本文介绍了聚类分析中的轮廓系数、调整兰德指数、互信息、同质性、完整性、V-measure、Fowlkes-Mallows 分数、Silhouette Coefficient、Calinski-Harabasz Index等指标,以及这些指标如何用于评估聚类分析结果。
悟乙己
2018/01/02
11.1K0
聚类︱python实现 六大 分群质量评估指标(兰德系数、互信息、轮廓系数)
用scikit-learn学习谱聚类
    在谱聚类(spectral clustering)原理总结中,我们对谱聚类的原理做了总结。这里我们就对scikit-learn中谱聚类的使用做一个总结。
刘建平Pinard
2018/08/14
2.3K0
【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析
本实验实现了使用谱聚类(Spectral Clustering)算法进行聚类分析
Qomolangma
2024/07/30
1490
【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析
聚类模型评价(python实现)
评价指标分为外部指标和内部指标两种,外部指标指评价过程中需要借助数据真实情况进行对比分析的指标,内部指标指不需要其他数据就可进行评估的指标。下表中列出了几个常用评价指标的相关情况:
三猫
2019/08/23
6.1K0
聚类模型评价(python实现)
用scikit-learn学习K-Means聚类
    在K-Means聚类算法原理中,我们对K-Means的原理做了总结,本文我们就来讨论用scikit-learn来学习K-Means聚类。重点讲述如何选择合适的k值。
刘建平Pinard
2018/08/14
7500
用scikit-learn学习K-Means聚类
【Scikit-Learn 中文文档】聚类 - 无监督学习 - 用户指南 | ApacheCN
2.3. 聚类 未标记的数据的 Clustering(聚类) 可以使用模块 sklearn.cluster 来实现。 每个 clustering algorithm (聚类算法)有两个变体: 一个是 class, 它实现了 fit 方法来学习 train data(训练数据)的 clusters(聚类),还有一个 function(函数),是给定 train data(训练数据),返回与不同 clusters(聚类)对应的整数标签 array(数组)。对于 class(类),training dat
片刻
2018/01/15
5.5K0
【Scikit-Learn 中文文档】聚类 - 无监督学习 - 用户指南 | ApacheCN
用scikit-learn学习DBSCAN聚类
    在DBSCAN密度聚类算法中,我们对DBSCAN聚类算法的原理做了总结,本文就对如何用scikit-learn来学习DBSCAN聚类做一个总结,重点讲述参数的意义和需要调参的参数。
刘建平Pinard
2018/08/14
2.3K0
用scikit-learn学习DBSCAN聚类
【机器学习 | 聚类】关于聚类最全评价方法大全,确定不收藏?
【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看? (一) 作者: 计算机魔术师 版本: 1.0 ( 2023.8.27 )
计算机魔术师
2023/11/27
1.7K0
【机器学习 | 聚类】关于聚类最全评价方法大全,确定不收藏?
机器学习中的聚类
聚类算法是一种无监督的机器学习算法。 它将一组数据分成若干个不同的群组,使得每个群组内部的数据点相似度高,而不同群组之间的数据点相似度低。常用的相似度计算方法有欧式距离法。
@小森
2024/05/24
880
机器学习中的聚类
机器学习认识聚类(KMeans算法)
导读:机器是怎样学习的,都学到了什么?人类又是怎样教会机器学习的?本文通过案例给你讲清楚各类算法的原理和应用。
润森
2019/08/29
1K0
机器学习认识聚类(KMeans算法)
KMeans+降维,实现用户聚类!
基于Python Outlier Detection库进行异常值处理(Kmeans对异常值敏感)。
皮大大
2023/11/09
8520
6个常用的聚类评价指标
评估聚类结果的有效性,即聚类评估或验证,对于聚类应用程序的成功至关重要。它可以确保聚类算法在数据中识别出有意义的聚类,还可以用来确定哪种聚类算法最适合特定的数据集和任务,并调优这些算法的超参数(例如k-means中的聚类数量,或DBSCAN中的密度参数)。
deephub
2023/11/24
1.7K0
6个常用的聚类评价指标
吴恩达《Machine Learning》精炼笔记 8:聚类 KMeans 及其 Python实现
比如下面的数据中,横纵轴都是xx,没有标签(输出yy)。在非监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中,快速这个数据的中找到其内在数据结构。
红色石头
2022/01/20
7290
吴恩达《Machine Learning》精炼笔记 8:聚类 KMeans 及其 Python实现
机器学习(26)之K-Means实战与调优详解
关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 前言 在K-Means聚类算法原理(机器学习(25)之K-Means聚类算法详解)中对K-Means的原理做了总结,本文来讨论用scikit-learn来学习K-Means聚类。重点讲述如何选择合适的k值。 K-Means类概述 在scikit-learn中,包括两个K-Means的算法,一个是传统的K-Means算法,对应的类是KMeans。另一个是基于采样的Mini Batch K
昱良
2018/04/04
5.8K0
机器学习(26)之K-Means实战与调优详解
精准用户画像!商城用户分群2.0!⛵
很多公司的技术人员在做用户画像的工作,细分客户/客户分群是一个很有意义的工作,可以确保企业构建更个性化的消费者针对策略,同时优化产品和服务。
ShowMeAI
2022/11/20
6830
精准用户画像!商城用户分群2.0!⛵
Python 无监督学习实用指南:1~5
在本章中,我们将介绍基本的机器学习概念,即 ,前提是您具有一些统计学习和概率论的基本知识 。 您将了解机器学习技术的使用以及逻辑过程,这些逻辑过程将增进我们对数据集的性质和属性的了解。 整个过程的目的是建立可支持业务决策的描述性和预测性模型。
ApacheCN_飞龙
2023/04/24
1.3K0
Python 无监督学习实用指南:1~5
机器学习算法之聚类算法
"If you set your goals ridiculously high and it's a failure, you will fail above everyone else's success.
小闫同学啊
2020/02/26
1.3K0
动手实践Scikit-learn(sklearn)
嗨伙计们,欢迎回来,非常感谢你的爱和支持,我希望你们都做得很好。在今天的版本中,我们将学习被称为sklearn的scikit-learn。
iOSDevLog
2018/12/07
8930
机器学习(8)——其他聚类层次聚类画出原始数据的图小结
层次聚类 紧接上章,本章主要是介绍和K-Means算法思想不同而的其他聚类思想形成的聚类算法。 k-means算法却是一种方便好用的聚类算法,但是始终有K值选择和初始聚类中心点选择的问题,而这些问题也会影响聚类的效果。为了避免这些问题,我们可以选择另外一种比较实用的聚类算法-层次聚类算法。顾名思义,层次聚类就是一层一层的进行聚类,可以由上向下把大的类别(cluster)分割,叫作分裂法;也可以由下向上对小的类别进行聚合,叫作凝聚法;但是一般用的比较多的是由下向上的凝聚方法。 本章主要涉及到的知识点有: 层次
DC童生
2018/04/27
1.8K0
机器学习(8)——其他聚类层次聚类画出原始数据的图小结
详细介绍了Python聚类分析的各种算法和评价指标
较为详细介绍了聚类分析的各种算法和评价指标,本文将简单介绍如何用python里的库实现它们。
润森
2022/08/18
2.5K0
详细介绍了Python聚类分析的各种算法和评价指标
相关推荐
聚类︱python实现 六大 分群质量评估指标(兰德系数、互信息、轮廓系数)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验