目录

  • 1.内部评价指标
    • 1.1 Silhouette Coefficient(轮廓系数)
      • sihoueette_score 参数介绍
      • silhouette_samples参数介绍
    • 1.2 Calinski-Harbasz Score
    • 1.3 Davies-Boulding(DBI)
  • 2.外部评价指标
    • Rand指数(Rand Index, RI)兰德系数
    • Mutual Information based scores
  • 其它
    • Homogeneity, completeness and V-measure
    • Fowlkes-Mallows scores
  • 它人观点
  • 参考资料

在做海量数据聚类分析(MiniBatch Kmeans)的时候,常常因为数据量太大画不出 dendrogram,没办法用 Elbow Method 确定 K 值。这时需要其他 metrics 辅助确定 K 值。在做聚类之前,一定要先做 去重啊!

受算法选择、算法参数设置、算法随机性等影响,聚类有效性会出现差异。

概括地说,评估聚类的方法主要有两种:

  • 内部评估方法:不需要借助其他监督数据,通过一个单一的量化得分评估算法好坏
  • 外部评估方法:需要知道数据的类别,通过将聚类结果与ground truth进行对比,评估算法好坏

实际生产环境中,很少有标注数据帮助我们进行聚类,因为很难人为地确定到底有多少个簇,簇之间的区别不是很明显,特别是对于文本数据。

1.内部评价指标

内部评估方法有:

  • Silhouette Coefficient(也叫轮廓系数)
  • Calinski-Harbasz Score(CH)
  • Davies-Boulding(DBI)

紧密度(Compactness):每个聚类簇中的样本点到聚类中心的平均距离。对应聚类结果,需要使用所有簇的紧密度的平均值来衡量聚类算法和聚类各参数选取的优劣。紧密度越小,表示簇内的样本点月集中,样本点之间聚类越短,也就是说簇内相似度越高。

分割度(Seperation):是个簇的簇心之间的平均距离。分割度值越大说明簇间间隔越远,分类效果越好,即簇间相似度越低。

戴维森堡丁指数(Davies-bouldin Index,DBI):该指标用来衡量任意两个簇的簇内距离之后与簇间距离之比。该指标越小表示簇内距离越小,簇内相似度越高,簇间距离越大,簇间相似度低。

邓恩指数(Dunn Validity Index,DVI):任意两个簇的样本点的最短距离与任意簇中样本点的最大距离之商。该值越大,聚类效果越好。

轮廓系数 (Silhouette Coefficient):对于一个样本集合,它的轮廓系数是所有样本轮廓系数的平均值。轮廓系数的取值范围是[-1,1],同类别样本距离越相近不同类别样本距离越远,分数越高。

当样本的真实标签未知时,聚类有效性可以通过内部评价指标进行评估。

聚类内部评价指标通过计算聚类结果的类内样本紧密程度或类间样本疏远程度来评价聚类结果优劣。

1.1 Silhouette Coefficient(轮廓系数)

轮廓系数(Silhouette Coefficient)适用于实际类别信息未知的情况。对于单个样本,设 aaa 是与它同类别中其他样本的平均距离,bbb 是与它距离最近不同类别中样本的平均距离,轮廓系数为:
s=b−amax(a,b)s=\frac{b-a}{max(a,b)}s=max(a,b)b−a​
Silhouette Coefficient 对于一个样本点需要计算两种距离: aaa 当前样本点与同类的其他样本点的平均距离,bbb 当前样本点与最接近的另一个类的其他样本点的平均距离,当前样本点的得分是 sss。

sss 衡量的是当前样本点是否离当前类的其他样本点近,并且与最接近的另一个类足够远。对于每个样本点都需要计算这样一个得分,计算复杂度可想而知。

对于一个样本集合,它的轮廓系数是所有样本轮廓系数的平均值。轮廓系数的取值范围是 [-1, 1] ,同类别样本越距离相近,且不同类别样本距离越远,分数越高。

缺点:

每种评估方法都各有优缺点,因为 Silhouette Coefficient 的计算复杂度太高,即使在 GPU 的机器上,跑 30w 数据跑了1个小时还没跑出来,所以考虑 Calinski-Harbasz Score,Calinski-Harbasz Score 的优点就在于计算速度非常快。

sihoueette_score 参数介绍

此函数返回所有样本的平均轮廓系数。要获取每个样本的值,请使用silhouette_samples

>>> import numpy as np
>>> from sklearn.cluster import KMeans>>> kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
>>> labels = kmeans_model.labels_
>>> metrics.silhouette_score(X, labels, metric='euclidean')
...
0.55...
sklearn.metrics.silhouette_score(X, labels, metric='euclidean', sample_size=None, random_state=None)
参数 X:数组[n_samples_a,n_samples_a](如果metric ==“ precomputed”),否则为[n_samples_a,n_features] 样本之间的成对距离数组或特征数组。
labels:数组,形状= [n_samples] 每个样品的预测标签。
metric : 计算要素阵列中实例之间的距离时使用的度量。默认是euclidean(欧氏距离)。 如果metric是字符串,则必须是允许的选项之一metrics.pairwise.pairwise_distances。如果X是距离数组本身,请使用metric="precomputed"。
maxlength 平均轮廓系数

silhouette_samples参数介绍

此函数返回所有样本的轮廓系数。

sklearn.metrics.silhouette_samples(X, labels, etric='euclidean')
参数 X:数组[n_samples_a,n_samples_a](如果metric ==“ precomputed”),否则为[n_samples_a,n_features] 样本之间的成对距离数组或特征数组。
labels:数组,形状= [n_samples] 每个样品的预测标签。
metric : 计算要素阵列中实例之间的距离时使用的度量。默认是euclidean(欧氏距离)。 如果metric是字符串,则必须是允许的选项之一metrics.pairwise.pairwise_distances。如果 X 是距离数组本身,请使用metric="precomputed"。
return 每个样本的轮廓系数

1.2 Calinski-Harbasz Score

这个计算简单直接,得到的 Calinski-Harabasz 分数值 sss 越大则聚类效果越好。Calinski-Harabasz 分数值 sss 的数学计算公式是:

s=SSBk−1/SSWN−k=tr(Bk)tr(Wk)×nE−kk−1s=\frac{SS_B}{k-1}/\frac{SS_W}{N-k}=\frac{tr(B_k)}{tr(W_k)}\times \frac{n_E-k}{k-1}s=k−1SSB​​/N−kSSW​​=tr(Wk​)tr(Bk​)​×k−1nE​−k​
其中, nEn_EnE​ 为训练样本数,kkk为类别数。BkB_kBk​ 为类别之间的协方差矩阵,WkW_kWk​为内部数据的协方差矩阵,trtrtr 为矩阵的迹。

也就是说,类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。

  • 其中,

    • kkk 代表聚类类别数,NNN 代表全部数据数目
    • SSBSS_BSSB​ 是类间方差
    • SSWSS_WSSW​ 是类内方差
    • BkB_kBk​ 为 between-clusters dispersion mean(类间距离)
    • WkW_kWk​ 为 within-cluster dispersion(类内部的距离)

在实际使用的过程中,发现类别越少,Calinski-Harbasz Score的分数越高,当 k=2 时,分数达到最高。但是30w数据分成2类也太敷衍了吧(抓狂)!于是开始研究这个 metrics 到底在评估什么东西。结论,当上述情况发生的时候,需要一个个 K 值去测试,找到一个local maxium(局部最高)的分数,这个分数对应的K值就是当前最佳的分类。根据:Calinski-Harabasz Index and Boostrap Evaluation with Clustering Methods

详细链接:Calinski-Harbasz Score详细资料链接

在scikit-learn中, Calinski-Harabasz Index对应的方法是metrics.calinski_harabaz_score。

优点:

  • 在真实的分群 label 不知道的情况下,可以作为评估模型的一个指标。
  • 与轮廓系数的对比,笔者觉得最大的优势:!相差几百倍!毫秒级。

同时,数值越小可以理解为:组间协方差很小,组与组之间界限不明显。

>>> import numpy as np
>>> from sklearn.cluster import KMeans>>> kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
>>> labels = kmeans_model.labels_
>>> metrics.calinski_harabaz_score(X, labels)
560.39...

1.3 Davies-Boulding(DBI)

戴维森堡丁指数(Davies-Bouldin index,DBI) ,又称为分类适确性指标,是由 大卫L·戴维斯唐纳德·Bouldin 提出的一种评估聚类算法优劣的指标。

综合考虑了类内样本相似度以及类间样本差异度 ,其值越小表征聚类有效性越高 ,假设我们有 mmm 个序列,将这些序列通过算法聚为 nnn 类,使用 DBI 聚类效果评价方法。具体定义如下:
DBI=1N∑i=1Nmax⁡j≠iSi‾+Sj‾∥wi−wj∥2DBI=\frac{1}{N}\sum^N_{i=1}\displaystyle \max_{j\neq i}\frac{\overline{S_i}+\overline{S_j}}{\left\| w_i-w_j\right\|_2}DBI=N1​i=1∑N​j=imax​∥wi​−wj​∥2​Si​​+Sj​​​

式中:DBIDBIDBI 表示 DBI 指标值;Si‾\overline{S_i}Si​​ 为第 iii 类样本到其类中心的平均欧氏距离; ∥wi−wj∥2\left\| w_i-w_j\right\|_2∥wi​−wj​∥2​为第 iii 和第 jjj 类的类中心欧氏距离。

分类个数的不同可以导致不同的值,DBI 值越小,分类效果越好(说明分散程度越低)。

详细链接:聚类算法评价指标:DBI指数(Davies-Bouldin)及Python实现

2.外部评价指标

外部评估方法有:

  • 纯度(Purity)
  • Jaccard系数(Jaccard Coefficient, JC)
  • FM指数(Fowlkes and Mallows Index, FMI)
  • Rand指数(Rand Index, RI)兰德系数
  • F值(F-measure)

Rand指数(Rand Index, RI)兰德系数

兰德系数(Rand index,RI)需要给定实际类别信息 C,假设 K 是聚类结果

RI 取值范围为[0,1],值越大意味着聚类结果与真实情况越吻合。

对于随机结果,RI并不能保证分数接近零。为了实现“在聚类结果随机产生的情况下,指标应该接近零”,调整兰德系数(Adjusted rand index, ARI)被提出,它具有更高的区分度:

调整兰德系数(Adjusted rand index) ARI 取值范围为[-1,1],值越大意味着聚类结果与真实情况越吻合。从广义的角度来讲,ARI 衡量的是两个数据分布的吻合程度。

优点

对任意数量的聚类中心和样本数,随机聚类的 ARI 都非常接近于 0;
取值在 [-1, 1] 之间,负数代表结果不好,越接近于 1 越好;
可用于聚类算法之间的比较。

缺点

ARI需要真实标签

>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]>>> metrics.adjusted_rand_score(labels_true, labels_pred)
0.24

Mutual Information based scores

互信息评分(Mutual Information based scores)与调整互信息( Adjusted mutual information):

利用基于互信息的方法来衡量聚类效果需要实际类别信息,MI 取值范围为[0,1],AMI 取值范围为[-1,1],它们都是值越大意味着聚类结果与真实情况越吻合。

优点:除取值范围在[0,1]之间,其他同 ARI,可用于聚类模型选择;
缺点:需要先验知识。(看sklearn上的例子,貌似需要输入已知标签和预测标签,这就有点麻烦了。)

Two different normalized versions of this measure are available, Normalized Mutual Information(NMI) and Adjusted Mutual Information(AMI). NMI is often used in the literature while AMI was proposed more recently and is normalized against chance:

>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
0.22504

其它

Homogeneity, completeness and V-measure

同质性homogeneity:每个群集只包含单个类的成员。
完整性completeness:给定类的所有成员都分配给同一个群集。

>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]>>> metrics.homogeneity_score(labels_true, labels_pred)
0.66...>>> metrics.completeness_score(labels_true, labels_pred)
0.42...

两者的调和平均V-measure:

>>> metrics.v_measure_score(labels_true, labels_pred)
0.51...

Fowlkes-Mallows scores

The Fowlkes-Mallows score FMI is defined as the geometric mean of the pairwise precision and recall:
FMI=TP(TP+FP)(TP+FN)FMI = \frac{TP}{\sqrt{(TP+FP)(TP+FN)}}FMI=(TP+FP)(TP+FN)​TP​

>>> from sklearn import metrics>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>>
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)
0.47140...

它人观点

个人比较偏好的三个指标有:Calinski-Harabaz Index(未知真实index的模型评估)、Homogeneity, completeness and V-measure(聚类数量情况)、轮廓系数。

参考资料

[1] 考虑双尺度相似性的负荷曲线集成谱聚类算法 2020.11
[2] Calinski-Harbasz Score 详解 2022.1
[3] 机器学习中评价指标的选择 2018.4
[4] 聚类算法评价指标——Davies-Bouldin指数(Dbi) 2018.5
[5] 聚类︱python实现 六大 分群质量评估指标(兰德系数、互信息、轮廓系数) 2017.4
[6] 聚类评价指标sklearn.metrics.calinski_harabasz_score 2022.8
聚类效果的外部评价指标——纯度(Purity)及其Python和matlab实现 2020.12
聚类分析的评价指标(性能度量) 2020.10
sklearn聚类算法评估方法 之各种系数 2017.11
机器学习评价指标大汇总 2016.4

内部和外部聚类算法评价指标相关推荐

  1. 聚类算法评价指标学习笔记

    聚类算法评价指标学习笔记 本文列举常用聚类性能度量指标,并列出相应代码与参考资料 聚类性能度量大致分两类,一类将聚类结果与某个"参考模型"(reference model)进行比较 ...

  2. 聚类算法评价指标之DBI指数及Python实现

    目录 1.概念介绍 2.具体计算步骤 3.Python实现 参考资料:https://blog.csdn.net/weixin_46713695/article/details/126385691?s ...

  3. r型聚类典型指标_常用的聚类算法及聚类算法评价指标

    1. 典型聚类算法 1.1 基于划分的方法 代表:kmeans算法 ·指定k个聚类中心 ·(计算数据点与初始聚类中心的距离) ·(对于数据点,找到最近的{i}ci(聚类中心),将分配到{i}ci中) ...

  4. 聚类算法评价指标——adjusted Rand index, ARI指数(调整兰德指数)

    目录 Rand指数(Rand Index, RI)兰德系数 调整兰德指数(adjustedRand index,ARI)是一种常见的聚类外部评价指标,其通过计算在真实标签和聚类结果中被分配在相同或不同 ...

  5. 聚类算法评价指标python实现_[ML] 聚类评价指标

    本文将介绍几个常见的聚类评价指标: Purity, NMI, RI, Precision(查准率), Recall(查全率), F, ARI, Accuracy(正确率). 好的聚类算法,一般要求类簇 ...

  6. 聚类算法评价指标python实现_聚类算法的评价指标

    如果有了类别标签,那么聚类结果也可以像分类那样计算准确率和召回率.scikitlearn上说:"其实不应该将分类标签作为聚类结果的评价指标,除非你有相关的先验知识或某种假设,知道这种分类类内 ...

  7. 聚类dbi指数_聚类算法评价指标——Davies-Bouldin指数(Dbi)

    最近在做一个时空序列聚类的小项目,度量聚类优劣的指标使用到了DBI指数,所以开始学习了一下DBI指数,以下是我的理解和基于python3的实现: 戴维森堡丁指数(DBI),又称为分类适确性指标,是由大 ...

  8. 聚类算法评价指标——Normalized Mutual Information, NMI指数

    目录 NMI 是一种常见的聚类有效性外部评价指标,从信息论的角度评估了两个聚类结果的相似性 . 设实验结果为 X,真实结果为 Y,则其计算式如下: 其中,I(X,Y)I (X,Y)I(X,Y)表示 X ...

  9. 【Python机器学习】聚类算法任务,评价指标SC、DBI、ZQ等系数详解和实战演示(附源码 图文解释)

    需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一.聚类任务 设样本集S={x_1,x_2,-,x_m}包含m个未标记样本,样本x_i=(x_i^(1),x_i^(2),-,x_i^(n))是一 ...

最新文章

  1. delphi tclientsocket接收不到返回数据_NB-IOT联网及模块UDP数据传输过程
  2. Python刷题-7
  3. linux下如何分区格式化硬盘,Linux之磁盘如何分区,格式化挂载
  4. [水池] 灌水专用:搜狗输入法里收集的纯文字表情
  5. 苹果Mac从睡眠模式唤醒后 Wi-Fi 无法连接如何解决?
  6. Eclipse插件系列:spring插件配置
  7. 渗透测试-postmessage xss
  8. coverity代码检测工具介绍_Coverity功能介绍
  9. matlab f检验 f值,excel检验【Excel回归分析中的F检验】
  10. Access denied for user 'root'@'localhost'. Account is locked
  11. 国内能用的国际邮箱推荐哪个?公司邮箱号码大全
  12. 三月模拟题——炉石传说
  13. 获奖结果公布|2020腾讯犀牛鸟云开发校园技术布道师养成计划
  14. 读《诗经·邶风·击鼓》有感-间歇博客
  15. C++一本通题库1015
  16. RO、RW和ZI段详解
  17. 微信中下载app无反应 微信浏览器无法apk下载链接方案
  18. python怎么读音发音英语-python英文怎么读
  19. 中国在6G专利上再进一步,申请量占比达五成,遥遥领先,美国的希望落空
  20. GreeNC:植物lncRNA数据库

热门文章

  1. php 的几种运行方式
  2. ESP32学习笔记(27)——BLE GAP主机端扫描
  3. 如何使用OpenCV进行Delaunay三角剖分和Voronoi图
  4. 零基础学大数据不知道该怎么学?给Hadoop初学者的一些建议
  5. JAVA—— AJAX
  6. Target Team工作任务及签到表(翟超)
  7. 人是什么?从生物学的角度来说,人就是直立行走无毛动物而已...这是一个多么可怕的世界啊
  8. 对一支圆珠笔进行测试,要从哪些方面进行测试?
  9. 图像处理-opencv去水印(如有图片侵权,请及时联系)
  10. 改装普通电脑为触屏电脑