聚类分析如可确定最佳的聚类簇数?

聚类与分类的不同在于,聚类所要求划分的类是未知的。也就是说我们对样本数据的划分是不了解。聚类分析的任务就是要明确这个划分。例如我们采集到很多未知的植物标本,并对每株标本的植物学特征进行了记录、量化。那么这些植物标本到底是几个物种呢?聚类分析就可以解决这个问题。

当前在机器学习领域涌现了许多优秀的聚类分析算法供我们使用,如k-means、DBSCAN、AGNES等。通过使用这些成熟的算法,我们很容易完成对数据样本的聚类分析。但是同时我们也普遍面临一个问题的困扰——对于类别未知的数据集合,分几个类别才是最优的?

可视化的手段是常用的,如上图。我们可以直观的判断样本聚集的质量。但是对于超出3维的高维数据,可视化手段就失效了。

聚类质量的判断标准是簇内相似度最高、簇间差异性最高,这个标准我们如何进行衡量呢?

今天我们介绍一个非常好有并且有效的工具——calinski_harabaz分数。calinski_harabaz分数的计算公式如下:

,其中m为样本总量,k为分类的数量(簇数),Bk是簇间协方差矩阵,Wk是簇内协方差矩阵,tr是矩阵的迹(矩阵主对角线(从左上方至右下方的对角线)上各个元素的总和被称为矩阵)。也就是说,类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabaz分数会高,聚类的结果就更好。

对于聚类结果的评价,我们还可以使用轮廓系数silhouette和兰德指数,从计算效率来看calinski_harabaz分数最高,所以一般来说calinski_harabaz分数更常用。

使用sklearn.metrics的calinski_harabaz_score(样本数据,聚类结果)函数就可以进行聚类结果的评价了。在实际工作中,我们可以使用如下算法完成最优聚类结果的选择:

import sklearn.metrics
ch_score=0
best=null
#args为聚类算法clustering的参数
for arg in args:
    clusters=clustering(sample,arg)
    _score=calinski_harabaz_score(sample,clusters)
    if(_score>ch_score):
        best=clusters
        ch_score=_score
output(best)

推荐自编课程《零基础学python数据分析》
推荐自编简明预测分析教程(Python版)

  • 20
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

interbigdata

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值