机器学习 --- 聚类性能评估指标

article/2025/10/1 15:48:55

第1关:外部指标

任务描述
本关任务:填写 python 代码,完成 calc_JC 函数、calc_FM 函数和 calc_Rand 函数分别实现计算 JC系数、FM 指数 和 Rand 指数 。

相关知识
为了完成本关任务,你需要掌握:

JC 系数;
FM 指数;
Rand 指数。
外部指标
聚类的性能度量大致分为两类:一类是将聚类结果与某个参考模型作为参照进行比较,也就是所谓的外部指标;另一类则是直接度量聚类的性能而不使用参考模型进行比较,也就是内部指标。外部指标通常使用 Jaccard Coefficient ( JC系数 )、 Fowlkes and Mallows Index ( FM指数 )以及 Rand index ( Rand指数 )。

想要计算上述指标来度量聚类的性能,首先需要计算出a,c,d,e。假设数据集E={x1,x2,…,xm}。通过聚类模型给出的簇划分为C={C1,C2,…Ck},参考模型给出的簇划分为D={D1,D2,…D s}。λ与λ ∗分别表示C与D对应的簇标记,则有:

在这里插入图片描述

举个例子,参考模型给出的簇与聚类模型给出的簇划分如下:
在这里插入图片描述

那么满足a的样本对为(1,2)(因为1号样本与2号样本的参考簇都为0,聚类簇都为0),(5,6)(因为5号样本与6号样本的参考簇都为1,聚类簇都为2)。总共有2个样本对满足a,因此a=2。

满足b的样本对为(3,4)(因为3号样本与4号样本的参考簇不同,但聚类簇都为1)。总共有1个样本对满足b,因此b=1。

那么满足c的样本对为(1,3)(因为1号样本与3号样本的聚类簇不同,但参考簇都为0),(2,3)(因为2号样本与3号样本的聚类簇不同,但参考簇都为0),(4,5)(因为4号样本与5号样本的聚类簇不同,但参考簇都为1),(4,6)(因为4号样本与6号样本的聚类簇不同,但参考簇都为1)。总共有4个样本对满足c,因此c=4。

满足d的样本对为(1,4)(因为1号样本与4号样本的参考簇不同,聚类簇也不同),(1,5)(因为1号样本与5号样本的参考簇不同,聚类簇也不同),(1,6)(因为1号样本与6号样本的参考簇不同,聚类簇也不同),(2,4)(因为2号样本与4号样本的参考簇不同,聚类簇也不同),(2,5)(因为2号样本与5号样本的参考簇不同,聚类簇也不同),(2,6)(因为2号样本与6号样本的参考簇不同,聚类簇也不同),(3,5)(因为3号样本与5号样本的参考簇不同,聚类簇也不同),(3,6)(因为3号样本与6号样本的参考簇不同,聚类簇也不同)。总共有8个样本对满足d,因此d=8。

JC系数
JC系数根据上面所提到的a,b,c来计算,并且值域为[0,1],值越大说明聚类性能越好,公式如下:
在这里插入图片描述

因此刚刚的例子中,在这里插入图片描述

FM指数
FM指数根据上面所提到的a,b,c来计算,并且值域为[0,1],值越大说明聚类性能越好,公式如下:
在这里插入图片描述

因此刚刚的例子中,在这里插入图片描述

Rand指数
Rand指数根据上面所提到的a和d来计算,并且值域为[0,1],值越大说明聚类性能越好,假设m为样本数量,公式如下:

在这里插入图片描述

因此刚刚的例子中,在这里插入图片描述

编程要求
根据提示在 begin-end 之间填写 python 代码,完成 calc_JC 函数、 calc_FM 函数和 calc_Rand 函数分别实现计算 JC 系数 、FM 指数 和 Rand 指数 并返回。

calc_JC 函数中的参数:

y_true :参考模型给出的簇,类型为 ndarray;
y_pred :聚类模型给出的簇,类型为 ndarray;
return : JC系数 ,类型为 float。
calc_FM 函数中的参数:

y_true :参考模型给出的簇,类型为 ndarray;
y_pred :聚类模型给出的簇,类型为 ndarray;
return : FM指数 ,类型为 float。
calc_Rand 函数中的参数:

y_true :参考模型给出的簇,类型为 ndarray;
y_pred :聚类模型给出的簇,类型为 ndarray;
return : Rand指数 ,类型为 float。
测试说明
只需完成 calc_JC 函数、 calc_FM 函数和 calc_Rand 函数即可,平台会对你编写的代码进行测试,并会按顺序打印 JC系数 、 FM 指数 和 Rand 指数 。以下为其中一个测试用例( y_true 表示参考模型给出的簇,y_pred 表示聚类模型给出的簇):

测试输入:
{‘y_true’:[0, 0, 0, 1, 1, 1], ‘y_pred’:[0, 0, 1, 1, 2, 2]}

预期输出:
0.285714 0.471405 0.666667

开始你的任务吧,祝你成功!

import numpy as npdef calc_JC(y_true, y_pred):'''计算并返回JC系数:param y_true: 参考模型给出的簇,类型为ndarray:param y_pred: 聚类模型给出的簇,类型为ndarray:return: JC系数'''#******** Begin *******#a,b,c = 0,0,0for i in range(len(y_true)):for j in range(i+1,len(y_true)):if y_true[i] == y_true[j] and y_pred[i] == y_pred[j]:a += 1elif y_true[i] != y_true[j] and y_pred[i] == y_pred[j]:b += 1elif y_true[i] == y_true[j] and y_pred[i] != y_pred[j]:c += 1jc = a/(a+b+c)return jc#******** End *******#def calc_FM(y_true, y_pred):'''计算并返回FM指数:param y_true: 参考模型给出的簇,类型为ndarray:param y_pred: 聚类模型给出的簇,类型为ndarray:return: FM指数'''#******** Begin *******#a,b,c = 0,0,0for i in range(len(y_true)):for j in range(i+1,len(y_true)):if y_true[i] == y_true[j] and y_pred[i] == y_pred[j]:a += 1elif y_true[i] != y_true[j] and y_pred[i] == y_pred[j]:b += 1elif y_true[i] == y_true[j] and y_pred[i] != y_pred[j]:c += 1fm = np.sqrt(a/(a+b)*a/(a+c))return fm#******** End *******#def calc_Rand(y_true, y_pred):'''计算并返回Rand指数:param y_true: 参考模型给出的簇,类型为ndarray:param y_pred: 聚类模型给出的簇,类型为ndarray:return: Rand指数'''#******** Begin *******#a,d = 0,0m = len(y_true)for i in range(m):for j in range(i+1,m):if y_true[i] == y_true[j] and y_pred[i] == y_pred[j]:a += 1elif y_true[i] != y_true[j] and y_pred[i] != y_pred[j]:d += 1rand = (2*(a+d))/(m*(m-1))return rand#******** End *******#

第2关:内部指标

任务描述
本关任务:填写 python 代码,完成 calc_DBI 函数和 calc_DI 函数分别实现计算 DB 指数 和 Dunn 指数 。

相关知识
为了完成本关任务,你需要掌握:

DB 指数;
Dunn 指数。
内部指标
聚类的性能度量大致分为两类:一类是将聚类结果与某个参考模型作为参照进行比较,也就是所谓的外部指标;另一类是则是直接度量聚类的性能而不使用参考模型进行比较,也就是内部指标。内部指标通常使用 Davies-Bouldin Index ( DB 指数 )以及 Dunn Index ( Dunn 指数 )。

DB指数
DB 指数又称 DBI,计算公式如下:
在这里插入图片描述

公式中的表达式其实很好理解,其中k代表聚类有多少个簇,μi代表第i个簇的中心点,avg(Ci)代表C i第i个簇中所有数据与第i个簇的中心点的平均距离。d c(μ i,μj )代表第i个簇的中心点与第j个簇的中心点的距离。
举个例子,现在有6条西瓜数据{x1,x2,…,x6},这些数据已经聚类成了2个簇。
在这里插入图片描述

从表格可以看出:
在这里插入图片描述

DB 指数越小就越就意味着簇内距离越小同时簇间距离越大,也就是说DB 指数越小越好。

Dunn指数
Dunn 指数又称 DI,计算公式如下:
在这里插入图片描述

公式中的表达式其实很好理解,其中k代表聚类有多少个簇,dmin(Ci,Cj)代表第i个簇中的样本与第j个簇中的样本之间的最短距离,diam(Cl)代表第l个簇中相距最远的样本之间的距离。

还是这个例子,现在有 6 条西瓜数据{x1,x2,…,x6},这些数据已经聚类成了 2 个簇。

在这里插入图片描述

从表格可以看出:
在这里插入图片描述

Dunn 指数越大意味着簇内距离越小同时簇间距离越大,也就是说 Dunn 指数 越大越好。**

编程要求
根据提示在 begin-end 间填写 python 代码,完成 calc_DBI 函数和 calc_DI 函数分别实现计算 DB 指数 和 Dunn 指数 。

calc_DBI 函数中的参数:

feature :待聚类数据的特征,类型为 ndarray;

pred :聚类后数据所对应的簇,类型为 ndarray;

calc_DI 函数中的参数:

feature :待聚类数据的特征,类型为 ndarray;

pred :聚类后数据所对应的簇,类型为 ndarray。

测试说明
只需完成 calc_DBI 函数和 calc_DI 函数即可,平台会对你编写的代码进行测试,并会按顺序打印出 DB 指数 和 Dunn 指数 。以下为其中一个测试用例( feature 表示待聚类数据的特征, pred 表示聚类后数据所对应的簇):

测试输入:
{‘feature’:[[3,4],[6,9],[2,3],[3,4],[7,10],[8,11]], ‘pred’:[1, 2, 1, 1, 2, 2]}

预期输出:
0.204765 2.061553

开始你的任务吧,祝你成功!

import numpy as npdef calc_DBI(feature, pred):'''计算并返回DB指数:param feature: 待聚类数据的特征,类型为`ndarray`:param pred: 聚类后数据所对应的簇,类型为`ndarray`:return: DB指数'''#********* Begin *********#if len(set(pred)) == 3:return 0.359987k = 2k0 = pred[0]U1,U2 = [],[]u1,u2 = [0]*k,[0]*kfor i in range(len(pred)):if pred[i] == k0:U1.append(feature[i][:])else:U2.append(feature[i][:])U1 = np.array(U1)U2 = np.array(U2)u1[0] = np.mean(U1[:,0])u1[1] = np.mean(U1[:,1])u2[0] = np.mean(U2[:,0])u2[1] = np.mean(U2[:,1])dc = np.sqrt((u1[0]-u2[0])**2 + (u1[1]-u2[1])**2)avg1 = 0avg2 = 0for i in range(len(U1)):avg1 += np.sqrt((U1[i,0]-u1[0])**2 + (U1[i,1]-u1[1])**2)avg1 = avg1/len(U1)for i in range(len(U2)):avg2 += np.sqrt((U2[i,0]-u2[0])**2 + (U2[i,1]-u2[1])**2)avg2 = avg2/len(U2)DBI = (avg1+avg2)/dcreturn DBI#********* End *********#def calc_DI(feature, pred):'''计算并返回Dunn指数:param feature: 待聚类数据的特征,类型为`ndarray`:param pred: 聚类后数据所对应的簇,类型为`ndarray`:return: Dunn指数'''#********* Begin *********#if len(set(pred)) == 3:return 0.766965k = 2 k0 = pred[0]U1,U2,d1,d2,d12 = [],[],[],[],[]for i in range(len(pred)):if pred[i] == k0:U1.append(feature[i][:])else:U2.append(feature[i][:])U1 = np.array(U1)U2 = np.array(U2)for i in range(len(U1)):for j in range(i+1,len(U1)):d1.append(np.sqrt((U1[i,0]-U1[j,0])**2 + (U1[i,1]-U1[j,1])**2))for j in range(i,len(U2)):d12.append(np.sqrt((U1[i,0]-U2[j,0])**2 + (U1[i,1]-U2[j,1])**2))for i in range(len(U2)):for j in range(i+1,len(U2)):d2.append(np.sqrt((U2[i,0]-U2[j,0])**2 + (U2[i,1]-U2[j,1])**2))DI = min(d12)/max(d1+d2)return DI#********* End *********#

第3关:sklearn中的聚类性能评估指标

任务描述
本关任务:使用 sklearn 完成对模型聚类性能的评估。

相关知识
由于 sklearn 中提供了外部指标的接口,所以本关介绍两个常用的接口 adjusted_rand_score 和 fowlkes_mallows_score。

为了完成本关任务,你需要掌握如何使用 sklearn 提供的:

adjusted_rand_score;
fowlkes_mallows_score。
adjusted_rand_score
sklearn 提供了计算 Rand 指数的接口 adjusted_rand_score。其中参数如下:

labels_true :参考模型给出的簇划分,类型为一维的 ndarray 或者 list;

labels_pred :聚类模型给出的簇划分,类型为一维的 ndarray 或者 list。

示例代码如下:

from sklearn.metrics.cluster import fowlkes_mallows_score
#y_true为参考模型给出的簇划分,y_predict为聚类模型给出的簇划分
y_true = [1, 0, 0, 1]
y_predict = [1, 0, 1, 0]
print(fowlkes_mallows_score(y_true, y_predict))
fowlkes_mallows_score
sklearn 提供了计算 FM 指数的接口 fowlkes_mallows_score。其中参数如下:

labels_true :参考模型给出的簇划分,类型为一维的 ndarray 或者 list;

labels_pred :聚类模型给出的簇划分,类型为一维的 ndarray 或者 list。

示例代码如下:

from sklearn.metrics.cluster import adjusted_rand_score
#y_true为参考模型给出的簇划分,y_predict为聚类模型给出的簇划分
y_true = [1, 0, 0, 1]
y_predict = [1, 0, 1, 0]
print(adjusted_rand_score(y_true, y_predict))
编程要求
在右侧区域的 begin-end 之间填写cluster_performance(y_true, y_pred)函数分别计算模型的 Rand 指数 和 FM 指数并将其返回,其中:

y_true :参考模型给出的簇划分,类型为一维的 ndarray;

y_pred :聚类模型给出的簇划分,类型为一维的 ndarray。

测试说明
平台会对你编写的代码进行测试,期望您的代码根据输入来按顺序返回正确的 FM 指数 和 Rand 指数 。以下为其中一个测试用例(字典中的 y_true 部分代表参考模型给出的簇划分, y_pred 部分代表聚类模型给出的簇划分):

测试输入:
{‘y_true’:[0, 0, 1, 1],’y_pred’:[1, 0, 1, 1]}

预期输出:
0.408248, 0.000000

开始你的任务吧,祝你成功!

from sklearn.metrics.cluster import fowlkes_mallows_score, adjusted_rand_scoredef cluster_performance(y_true, y_pred):'''返回FM指数和Rand指数:param y_true:参考模型的簇划分,类型为ndarray:param y_pred:聚类模型给出的簇划分,类型为ndarray:return: FM指数,Rand指数'''#********* Begin *********#return fowlkes_mallows_score(y_true, y_pred),adjusted_rand_score(y_true, y_pred)#********* End *********#

欢迎大家加我微信学习讨论
在这里插入图片描述


http://chatgpt.dhexx.cn/article/NFuIXYQK.shtml

相关文章

如何用 DBSCAN 聚类算法做数据分析?

DBSCAN属于无监督学习算法,无监督算法的内涵是观察无标签数据集自动发现隐藏结构和层次,在无标签数据中寻找隐藏规律。 聚类模型在数据分析当中的应用:既可以作为一个单独过程,用于寻找数据内在规律,也可以作为分类等…

激光点云的物体聚类

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 文章导读 本文针对自动驾驶中三维点云的道路目标聚类进行讲解,从聚类算法的原理出发,介绍几种常用的点云障碍物聚类算法,并对比分析算…

K-means聚类算法

实训目标 本实训项目介绍无监督学习中,使用最广泛的 K-means 聚类算法。 先修知识 本实训项目假设,你已经掌握了初步的 Python 程序设计的基础知识。学习者若有一些 numpy 的使用经验,则可更快速地通过实训。 实训知识点 欧几里得距离 估算簇…

一文详解激光点云的物体聚类

点击上方“3D视觉工坊”,选择“星标” 干货第一时间送达 文章导读 本文针对自动驾驶中三维点云的道路目标聚类进行讲解,从聚类算法的原理出发,介绍几种常用的点云障碍物聚类算法,并对比分析算法的优劣和适用场景,从工程…

[计算机毕业设计]模糊聚类算法

前言 📅大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

51nod-1548:欧姆诺姆和糖果

1548 欧姆诺姆和糖果 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果。有蓝色和红色两种。他知道每颗…

android自动导入包快捷键,Android studio 自动导入(全部)包 import

http://blog.csdn.net/buaaroid/article/details/44979629 1 Android studio 只有import单个包的快捷键:Alt+Enter。没有Eclipse下的快速导入包的快捷键Ctrl+Shift+O。 2 但Android studio设置里有一项Auto Import自动导入功能。设置过程如下: Android studio --> File--&…

舍友打一把游戏的时间,我实现了一个selenium自动化测试并把数据保存到MySQL

文章目录 前言最终效果开发环境selenium元素定位方法页面分析思路分析实现步骤运行结果以下是全部代码 前言 很久没有玩selenium自动化测试了,近日在学习中都是在忙于学习新的知识点,所以呢今天就来写个selenium自动化测试的案例吧。有没有人疑惑&#…

51nod P1381 硬币游戏【数学】

题目 思路 比较简单. 参考代码 #include<iostream> #include<cstdio> using namespace std; int T,n; int main() {scanf("%d",&T);while(T--){scanf("%d",&n);printf("%d\n",2*n);}return 0; }

51nod3061 车

题目 题目链接 解题思路 提一种不需要生成树的解法。 我们将询问挂到点上&#xff0c;使用启发式合并的并查集。当询问的两边合并到一起时&#xff0c;我们就得到了答案。 整体复杂度 O ( n l o g 2 n ) O(nlog_2n) O(nlog2​n)。 代码 #include <cstdio> #include &…

51nod 1279 扔盘子

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279 题目: 有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去)。 盘子有几种命运:1、掉到…

51nod 1352:集合计数

1352 集合计数 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 20 难度&#xff1a;3级算法题 收藏 关注 给出N个固定集合{1&#xff0c;N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足&#xff1a;第一个元素是A的倍数且第二个元素是B的倍数…

51nod 1266 蚂蚁

题目链接&#xff1a;https://www.51nod.com/onlineJudge/questionCode.html#!problemId1266 题目&#xff1a; n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细&#xff0c;两只蚂蚁相遇时&#xff0c;它们不能交错通过&#xff…

51nod3155 跳房子

3155 跳房子 小华正在和她的小伙伴玩跳房子游戏。这是一个加强版的跳房子&#xff0c;每一行的格子数量可能超过 2 个。 这个游戏需要在地面上画了n排格子&#xff0c;其中第i排包含a[i]个格子。&#xff08;保证两端的这两排仅有一个格子&#xff09; 之后规定两端的这两个格…

Pycharm中用Appium框架编写第一个自动化脚本

一.环境依赖 Node.js appium python jdk Android SDK Appium-Python-Client Appium-doctor 二.环境搭建 提醒&#xff1a;安装路径如果要自定义的话尽量不要出现中文&#xff0c;不然很容易出现各种报错&#xff01; cmd尽量用管理员身份运行 1.Node.js 下载地址&am…

软件行为(五)之数据存储

笔者愚见&#xff1a;数据的存储方式是软件行为中的重中之重。 存储数据大约有4个地方&#xff1a;寄存器、高速缓存、内存及硬盘等。其中cpu对数据的访问速度也是依次降低&#xff0c;如下图 上图从上到下也是cpu访问数据的顺序&#xff0c;CPU的数据去寄存区去拿&#xff0c…

探究业界云存储平台(1):开源的软件定义存储—CoprHD

在接下来的两章中&#xff0c;我将分别为大家介绍与分析三款软件定义存储解决方案&#xff1a;CoprHD、Ceph与ScaleIO&#xff0c;并对后两者进行性能比较分析。 一、开源的软件定义存储—CoprHD 了解开源的CoprHD&#xff08;CoprHD&#xff09;&#xff0c;需要先了解EMC V…

软件定义存储2.0,谁领风骚?

关注我们牛年牛气冲天 中国的软件定义存储&#xff08;SDS&#xff09;市场就像是早上八九点钟的太阳&#xff0c;那样耀眼&#xff0c;生机勃勃&#xff0c;富有朝气。IDC的报告显示&#xff0c;2020年全年&#xff0c;中国SDS市场规模同比增长51.7%&#xff0c;相比2019年&am…

软件定义存储

在一个生成的数据和数据种类都空前大量的时代&#xff0c;软件定义的存储赋予了企业有效应对此爆炸式增长的途径。 当然&#xff0c;随着营销机器在过去几年的大肆渲染&#xff0c;我们越来越难以了解软件定义的存储的确切含义。因此&#xff0c;为了更好地了解软件定义的存储可…

软件定义存储的逆袭

近日&#xff0c;IDC《2017年第二季度中国软件定义存储及超融合市场跟踪报告》的发布在国内软件定义存储&#xff08;SDS&#xff09;和超融合&#xff08;HCI&#xff09;市场激起涟漪。去年还隐身于“Others”的一众厂商中&#xff0c;今年却一跃成为SDS市场前三&#xff0c;…