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

news2024/12/25 13:29:21

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.coloradmin.cn/o/1054242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Axure】常见元件、常用交互效果

产品结构图 以微信为例,根据页面层级制作 动态面板 动态面板的作用:动态面板是一个可视区域,如果要把控件放进去,要全部放进去,放多少显示多少 文本框 隐藏边框方法:先拉一个矩形,去掉部分…

uniapp项目实践总结(二十五)苹果 ios 平台 APP 打包教程

导语:当你的应用程序开发完成后,在上架 ios 应用商店之前,需要进行打包操作,下面就简单介绍一下打包方法。 目录 准备工作注册账号生成证书打包配置准备工作 在打包之前,请保证你的 uniapp 应用程序编译到 ios 模拟器或者是真机调试基座环境下是可以正常运行的,苹果打包…

记录一次阿里云服务器ECS上启动的portainer无法访问的问题

如下图,在阿里云ECS服务器上安装并启动了portainer,但是在自己电脑上访问不了远程的portainer。 最后发现是要在网络安全组里开放9000端口号,具体操作如下: 在云服务器管理控制台点击左侧菜单中的网络与安全-安全组,然…

国庆day2---select实现服务器并发

select.c&#xff1a; #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__:",__LINE__);\perror(msg);\ }while(0)#define IP "192.168.1.3" #define PORT 8888int main(int argc, const char *argv[]) {//创建报式套接字socketi…

Java笔记五(数组)

目录 数组 数组声明创建 数组初始化的三种初始化类型&#xff1a; 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 数组的使用 示例一&#xff1a;计算所有的元素和以及查找最大元素 示例二&#xff1a;For-Each循环 示例三&#xff1a;数组作…

[NOIP2011 提高组] 选择客栈

[NOIP2011 提高组] 选择客栈 题目描述 丽江河边有 n n n 家很有特色的客栈&#xff0c;客栈按照其位置顺序从 1 1 1 到 n n n 编号。每家客栈都按照某一种色调进行装饰&#xff08;总共 k k k 种&#xff0c;用整数 0 ∼ k − 1 0 \sim k-1 0∼k−1 表示&#xff09;&am…

【论文笔记】SVDM: Single-View Diffusion Model for Pseudo-Stereo 3D Object Detection

原文链接&#xff1a;https://arxiv.org/abs/2307.02270 1. 引言 目前的从单目相机生成伪传感器表达的方法依赖预训练的深度估计网络。这些方法需要深度标签来训练深度估计网络&#xff0c;且伪立体方法通过图像正向变形合成立体图像&#xff0c;会导致遮挡区域的像素伪影、扭…

初识Java 12-1 流

目录 Java 8对流的支持 流的创建 随机数流 int类型的区间范围 generate() iterate() 流生成器 Arrays 正则表达式 本笔记参考自&#xff1a; 《On Java 中文版》 ||| 流的概念&#xff1a;流是一个与任何特定的存储机制都没有关系的元素序列。 流与对象的成批处理有关…

CSP-J第二轮试题-2021年-3题

文章目录 参考&#xff1a;总结 [CSP-J 2021] 网络连接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 样例 #4样例输入 #4样例输出 #4 提示答案1答案2 现场真题注意事项 参考&#xff1a; https://www…

使用 MyBatis 进行批量插入操作

使用 MyBatis 进行批量插入操作 批量插入是在数据库中同时插入多条记录的操作&#xff0c;通常用于提高数据插入的效率&#xff0c;特别是在需要大量数据导入或初始化时。MyBatis是一款流行的Java持久层框架&#xff0c;它提供了简单而强大的方式来执行批量插入操作。本文将介…

【数据结构】树的概念理解和性质推导(保姆级详解,小白必看系列)

目录 一、前言 &#x1f34e; 为什么要学习非线性结构 ---- 树&#xff08;Tree&#xff09; &#x1f4a6; 线性结构的优缺点 &#x1f4a6; 优化方案 ----- 树&#xff08;Tree&#xff09; &#x1f4a6; 树的讲解流程 二、树的概念及结构 &#x1f350; 树的概念 &…

vue + openlayer 按路径移动

示例 创建一个方形的规矩&#xff0c;并让点按轨迹移动。效果如下: 源代码 <template><div><div id"map" class"map"></div><button id"start-animation" ref"startButton">Start Animation</bu…

【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作

【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 文章目录 手势识别人脸追踪键盘控制整体代码附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 视频&#xff1a; 基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 手…

Cursor不要太好用,看图见真相

看图见真相: Cursor安装地址: https://www.cursor.so/

02_静态链接和简单宕机分享

ARM64寄存器 Arm64提供31个64bit通用寄存器 汇编用x表示64位宽 w32位宽 X0~X7: 用于传递子程序参数和结果&#xff0c;使用时不需要保存&#xff0c;多余参数采用堆栈传递&#xff0c;64位返回结果采用x0表示&#xff0c;128位 返回结果采用X1:X0 表示。 X24到x28 看得出来子…

C++容器之unordered_map、unordered_set的底层剖析

文中源码以上传至Gitee 目录 序列式容器和关联式容器unordered_set和unordered_map 哈希表概念 哈希函数与哈希冲突常用的哈希函数直接定址法除留余数法 哈希冲突处理方案开放定址法链地址法开放定地址法和链地址法对比 开放定址法实现链地址法实现unordered_map和unordered_s…

什么是SQL注入(SQL Injection)?如何预防它

什么是 SQL 注入&#xff08;SQL Injection&#xff09;&#xff1f;如何预防它&#xff1f; SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者通过在应用程序的输入中插入恶意SQL代码来执行未经授权的数据库操作。SQL注入攻击可能导…

CSP-J第二轮试题-2020年-4题

文章目录 参考&#xff1a;总结 [CSP-J2020] 方格取数题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例 1 解释 样例 2 解释 数据规模与约定 答案1 现场真题注意事项 参考&#xff1a; P7074 [CSP-J2020] 方格取数 总结 本系…

Docker 自动化部署(实践)

常用命令 docker search jenkins查看需要的jenkins镜像源 docker pull jenkins/jenkins 拉取jenkins镜像 docker images查看下载的镜像源 docker ps 查看包含启动以及未启动的容器 docker ps -a查看启动的容器 docker rm 容器id/容器名称 删除容器 docker rm -f 容器id/容器名…

算法基础课第一部分

算法基础课 第一讲 基础算法快速排序归并排序二分整数二分模板AcWing 789. 数的范围(整数二分法)AcWing 1236.递增三元组AcWing 730. 机器人跳跃问题AcWing 1227. 分巧克力AcWing 1221. 四平方和(二分法/哈希)蓝桥杯-扫地机器人 (二分贪心)AcWing 790. 数的三次方根(浮点二分法…