机器学习算法基础--聚类问题的评价指标

news/2024/5/20 6:23:06 标签: 机器学习, 算法, 聚类

1.聚类问题指标评价的意义

    聚类算法是非监督学习最常用的一种方法,性能度量是衡量学习模型优劣的指标,
  也可作为优化学习模型的目标函数。聚类性能度量根据训练数据是否包含标记数据
  分为两类,一类是将聚类结果与标记数据进行比较,称为“外部指标”;另一类是直
  接分析聚类结果,称为内部指标。本文对这两类的性能度量以及相似度方法作一个
  详细总结。
  本文将总结的指标如下所示:
  外部指标:
  1.兰德系数(RI)
  2.调整兰德系数(ARI)
  3.同质性(homogeneity)度量
  4.完整性(completeness)度量
  5.V-Measure值(h和c的调和平均值)度量
  内部指标
  1.轮廓系数(Silhouette Coefficient)
  2.Caliniski-Harabaz指数

2.外部评价指标计算

2.1.兰德系数(RI)计算方法

  首先我们定义两两配对变量a和b:
  a:数据集的样本对既属于相同簇C也属于相同簇K的个数
  b:数据集的样本对不属于相同簇C也不属于相同簇K的个数
  比如对于如下的真实簇和预测簇向量:
    真实簇向量:[ 0, 0, 0, 1, 1, 1 ]
    预测簇向量:[ 0, 0, 1, 1, 1, 1 ]
  根据a的定义,a表示在C,K两簇都是相同簇的样本对数,由上我们知道为a=2([0,0]和[1,1]满足题意)
  根据b的定义,b表示在C和K中都是不同簇的样本的个数,由上我们知道b=1([0,1]->[1,1]符合条件)
RI是衡量两个簇类的相似度,假设样本个数是n,定义:
R I = a + b C n 2 RI=\frac{a+b}{C_{n}^{2} } RI=Cn2a+b
  基于上述样本,n=6,cluters=3,所以RI的计算结果如下所示:
R I = a + b C 6 3 = 2 + 1 15 = 1 5 RI=\frac{a+b}{C_{6}^{3} } =\frac{2+1}{15} =\frac{1}{5} RI=C63a+b=152+1=51

2.2.调整兰德系数(ARI)计算方法

  RI系数的缺点是随着聚类数的增加,随机分配簇类向量的RI也逐渐增加,这是不符合理论的,随机分配簇类标记向量的RI应为0。
  对于随机结果,RI并不能保证分数接近零。为了实现“在聚类结果随机产生的情况下,指标应该接近零”,调整兰德系数( Adjusted randindex)被提出,它具有更高的区分度,其计算公式如下所示:
A R I = R I − E [ R I ] m a x ( R I ) − E [ R I ] ARI=\frac{RI-E[RI]}{max(RI)-E[RI]} ARI=max(RI)E[RI]RIE[RI]
  相关Python代码如下所示:

from sklearn.metrics import adjusted_rand_score
true_labels = [ 0, 0, 0, 1, 1, 1 ]# 真实的标签
predicted_labels = [ 0, 0, 1, 1, 2, 2 ]# 聚类结果的标签
ari_score = adjusted_rand_score(true_labels, predicted_labels)
print("调整兰德系数:",ari_score )

2.3.同质性度量的计算方法

  我们给出同质性度量的计算公式如下所示:
h = 1 − H ( C ∣ K ) H ( C ) h=1-\frac{H(C|K)}{H(C)} h=1H(C)H(CK)
H ( C ∣ K ) 是给定簇划分条件下类别划分的条件熵 , H ( C ∣ K ) = − ∑ c = 1 ∣ C ∣ ∑ k = 1 ∣ K ∣ n c , k n log ⁡ ( n c , k n k ) , H ( C ) 是类别划分熵 , H ( C ) = − ∑ c = 1 ∣ C ∣ n c n log ⁡ ( n c n ) , n 表示实例总数。 H(C \mid K) 是给定簇划分条件下类别划分的条件熵, \\ H(C \mid K)= -\sum_{c=1}^{|C|} \sum_{k=1}^{|K|} \frac{n_{c, k}}{n} \log \left(\frac{n_{c, k}}{n_{k}}\right), H(C) 是类别划分熵, \\ H(C)=-\sum_{c=1}^{|C|} \frac{n_{c}}{n} \log \left(\frac{n_{c}}{n}\right), n 表示实例总 数。 H(CK)是给定簇划分条件下类别划分的条件熵,H(CK)=c=1Ck=1Knnc,klog(nknc,k),H(C)是类别划分熵,H(C)=c=1Cnnclog(nnc),n表示实例总数。
  相关Python代码如下所示:

from sklearn.metrics import homogeneity_score
true_labels = [ 0, 0, 0, 1, 1, 1 ]# 真实的标签
predicted_labels = [ 0, 0, 1, 1, 2, 2 ]# 聚类结果的标签
homogeneity = homogeneity_score(true_labels, predicted_labels)
print("同质性:", homogeneity)

2.4.完整性度量的计算方法

  完整性度量的各个参数的都类似于同质性度量,其是计算公式如下所示:
h = 1 − H ( K ∣ C ) H ( K ) h=1-\frac{H(K|C)}{H(K)} h=1H(K)H(KC)
  相关Python代码如下所示:

from sklearn.metrics import completeness_score
true_labels = [ 0, 0, 0, 1, 1, 1 ]# 真实的标签
predicted_labels = [ 0, 0, 1, 1, 2, 2 ]# 聚类结果的标签
completeness = completeness_score(true_labels, predicted_labels)
print("完整性:", completeness)

2.5.V-Measure值的计算方法

  V-Measure的计算方法是h和c的调和平均数,其计算公式如下所示:
V = 2 h c h + c V=\frac{2hc}{h+c} V=h+c2hc
  相关Python代码如下所示:

#%%
from sklearn.metrics import v_measure_score
true_labels = [ 0, 0, 0, 1, 1, 1 ]# 真实的标签
predicted_labels = [ 0, 0, 1, 1, 2, 2 ]# 聚类结果的标签
v_measure = v_measure_score(true_labels, predicted_labels)
print("V度量:", v_measure)

3.内部评价指标计算

3.1.轮廓系数的计算方法

  轮廓系数(Silhouette coeffcient ) 适用于实际类别信息未知的情况。对于单个样本,设a 是与它同类别中其他样本的平均距离,b是与它距离最近不同类别中样本的平均距离,轮廓系数为:
s = b − a m a x ( a , b ) s=\frac{b-a}{max(a,b)} s=max(a,b)ba
  相关Python代码如下所示:

#%%
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
X=[[0,1,2,6],[1,0,2,6],[2,1,0,6],[6,6,6,0]]
y=[0,0,0,1]
kmeans = KMeans(n_clusters=3)	
# 根据数据data进行聚类,结果存放于result_list中
result_list = kmeans.fit_predict(X)
# 将原始的数据data和聚类结果result_list
score = silhouette_score(X, result_list)
print(score)

3.2.Calinski-Harabaz的计算方法

  这种计算方法简单直接并且得到的数据越大越好,下面给出Calinski-Harabaz因子的计算方式:
在这里插入图片描述
  也就是说,类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。
  相关Python代码如下所示:

#%%
#%%
import numpy as np
from sklearn import metrics
from sklearn.cluster import KMeans
X=[[0,1,2,6],[1,0,2,6],[2,1,0,6],[6,6,6,0]]
y=[0,0,0,1]
kmeans = KMeans(n_clusters=3)	
result_list = kmeans.fit_predict(X)
calinski_harabasz_score= metrics.calinski_harabasz_score(X, result_list)
print(calinski_harabasz_score)

4.致谢

本章内容的完成离不开以下大佬文章的启发和帮助,在这里列出名单,如果对于内容还有不懂的,可以移步对应的文章进行进一步的理解分析。
1.聚类评价指标的外部指标评价:https://blog.csdn.net/fengdu78/article/details/103951665
2.聚类评价指标的外部指标评价:https://zhuanlan.zhihu.com/p/145989213
3.聚类评价指标的内部指标评价:https://blog.csdn.net/sinat_26917383/article/details/70577710
在文章的最后再次表达由衷的感谢!!

http://www.niftyadmin.cn/n/5062416.html

相关文章

【菜鸡学艺--Vue2--002】[基础指令[条件与循环]

🦖我是Sam9029,一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **🐱‍🐉🐱‍🐉恭喜你,若此文你认为写的不错,不要吝啬你的赞扬,求…

【工具】idea 设置自动渲染注释

前言 需求:自动渲染文档注释,看源码更加舒服。 已知 crtl alt Q 可以 设置 尝试搜索 render,发现有启用 “渲染文档注释” 的地方 坐标 : Settings -> Editor-> Appearance

2023年汉字小达人市级比赛题型示例和全真在线练习题

上一篇文章中,六分成长介绍了2023年汉字小达人市级比赛的相关安排和常见的问题解答,这篇文章我来给大家介绍具体的题型和典型试题,并且将这些模拟题做成了电子版,每次抽题150道,和市级比赛完全一样,尽早熟悉…

算法刷题记录-图(LeetCode)

994. Rotting Oranges 思路 BFS 以腐烂的橘子作为起始点&#xff0c;使用BFS逐级向外拓展&#xff0c;并时刻使用cnt记录良好的橘子的数量。 代码 class Solution { public:int directions[4][2] {{0, 1},{0, -1},{1, 0},{-1, 0}};int orangesRotting(vector<vector…

软考 系统架构设计师系列知识点之软件架构风格(2)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件架构风格&#xff08;1&#xff09; 这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;11月4号就要考试&#xff0c;因此…

Windows历史版本下载

1、微PE工具箱&#xff08;非广告本人常用&#xff09; 常用安装Windows系统的微PE工具 地址&#xff1a;https://www.wepe.com.cn/download.html 2、Windows系统下载地址&#xff08;非微软官方&#xff09; 地址&#xff1a;MSDN, 我告诉你 - 做一个安静的工具站 下载&…

轮询与中断

中断控制器 #include"exynos_4412.h"int main() {/*产生一个中断信号*//*1.属于外设层次&#xff0c;让外部的硬件控制器能产生一个中断信号并发送给中断控制器*//*将GPX1_1设置成中断功能*/GPX1.CON GPX1.CON |( 0xF << 4);/*设置GPX1_1中断的触发方式---下降…