语义相关性评估指标:召回率、准确率、Roc曲线、AUC;Spearman相关系数、NDCG、mAP。代码及计算示例。

news2024/11/27 4:14:44

常规的语义相关性评价可以从检索、排序两个方面进行。这里只贴代码。详细可见知乎https://zhuanlan.zhihu.com/p/682853171

检索

精确率

def pre(true_labels=[],pre_labels=[]):
    """
    :param true_labels: 正样本索引
    :param pre_labels: 召回样本索引
    :return: 精确率
    """
    Predict_Pos = len(pre_labels)
    TP = len( set(true_labels) & set(pre_labels) )
    return TP / Predict_Pos 

计算示例:略。

召回率

def rec(true_labels=[],pre_labels=[]):
    """
    :param true_labels: 正样本索引
    :param pre_labels: 召回样本索引
    :return: 召回率
    """
    TP = len( set(true_labels) & set(pre_labels) )
    All_Pos = len(true_labels)
    return TP / All_Pos

计算示例:略。

ROC曲线和AUC

def roc_curve(rec_list=[], pre_list=[]):
    """
    :param rec_list: 召回率列表
    :param pre_list: 精确率列表
    :return: AUC
    """
    assert len(rec_list) == len(pre_list)
    # 召回、准确临界情况
    rec_list += [1, 0]
    pre_list += [0, 1]
    # 同一条横/纵轴有多个点的情况: 相同recall值下取precision的均值。
    rec_dict = {} # recall:[多个precisions]
    for i in range(len(rec_list)):
        if rec_list[i] not in rec_dict:
            rec_dict[rec_list[i]] = [pre_list[i]]
        else:
            rec_dict[rec_list[i]].append(pre_list[i])
    rec_list = []
    pre_list = []
    for key in rec_dict:
        rec_list.append(key)
        pre_list.append(sum(rec_dict[key])/len(rec_dict[key]))
    # 重排序
    rec_list_sorted = sorted(rec_list)
    pre_list_sorted = [pre_list[idx] for idx, _ in sorted(enumerate(rec_list), key=lambda x: x[1])]
    print(f"recall:{rec_list_sorted}. precision:{pre_list_sorted}.")
    # ROC曲线
    plt.plot(rec_list_sorted, pre_list_sorted)  # 画折线图
    plt.xlabel("Recalls")
    plt.ylabel("Precisions")
    plt.show()  # 显示图形
    # 曲线下面积计算
    auc = simps(pre_list_sorted, x=rec_list_sorted)
    return auc

计算示例:略。

排序

Supearman相关系数

def spearman(true_labels, predict_labels):
    """
    :param true_labels: 真实样本标签。
    :param predict_labels: 对应索引的预测样本标签。
    :return: Spearman系数。
    """
    return spearmanr(true_labels, predict_labels)

计算示例:
true_labels = [0.9, 0.6 ,0.3]
predict_labels = [0.6, 0.4, 0.5]
真实标签的排序等级顺序为:[1, 2 ,3] ;预测标签排序等级为:[1, 3, 2]。
根据简化公式:
在这里插入图片描述
di表示第i项的位序等级差,即d = [0, 1, 1]。
Spearman计算为:1-62/3(9-1)=0.5。

NDCG

def getDCG(scores):
    """
    :param scores: 排序结果的真实相关性分数。真实相关性分数靠前的样本,增益(Gain)更高。当前scores中取值为 3、2、1。
    :return: DCG。
    """
    # DCG。考虑顺序,使排名靠前的增益更高。
    scores = np.array(scores)
    return np.sum(
        np.divide( scores, np.log2(np.arange(scores.shape[0], dtype=np.float32)+2) ),
        dtype=np.float32)

def getNDCG(true_labels, predict_labels):
    """
    :param true_labels: 真实标签。
    :param predict_labels: 预测标签。
    :return: NDCG。
    """
    # 计算IDCG
    idcg = getDCG(sorted(true_labels,reverse=True))
    # 获得当前预测标签下的样本排序。
    suppport_for_relevance = [(true_label,predict_label) for true_label,predict_label in zip(true_labels,predict_labels)]
    suppport_for_relevance = sorted(suppport_for_relevance, key=lambda x: x[1], reverse=True)
    # 计算当前预测排序结果下的DCG。
    sort_relevance = [i[0] for i in suppport_for_relevance]
    dcg = getDCG(sort_relevance)
    return dcg/idcg

计算示例:
true_labels = [0.9, 0.6 ,0.3]
predict_labels = [0.6, 0.4, 0.5]
预测标签下的索引排序为[1, 3, 2],对应的相关性得分为[0.9, 0.3, 0.6]。
DCG = 0.9/log2(2)+0.3/log2(3)+0.6/log2(4) = 1.3892
IDCG = 0.9/log2(2)+0.6/log2(3)+0.3/log2(4) = 1.4286
NDCG = DCG/IDCG = 0.9725

mAP

def AP(true_labels, predict_labels):
    """
    :param true_labels: 真实样本标签。
    :param predict_labels: 对应索引的预测样本标签。
    :return: Average Precision。
    """
    R = len(true_labels)
    sorted_indexes = sorted(range(len(predict_labels)), key=lambda x: predict_labels[x], reverse=True)
    TP = 0
    P = 0 # @N的N。
    average_precision = 0
    for i in sorted_indexes:
        P += 1
        # 相关性3(pos样本)定义为正样本
        if true_labels[i]==3:
            TP += 1
        average_precision += TP/P*(true_labels[i]-1)/2
    average_precision/=R
    return average_precision

计算示例:
true_labels = [3, 2, 1]
根据公式将true_label归一化到了[1, 0.5, 0],作为相关性得分。
predict_labels = [0.6, 0.4, 0.5],根据预测标签排序后的真实标签相关性得分为[1, 0, 0.5]
将标签3视为正样本,则对应索引的正负样本为[1, 0, 0]。
预测标签下的索引排序为[1, 3, 2],对应的precision@1/2/3为[1, 0.5, 1/3]。
AP = 1/3 * (11 + 00.5 + 0.5* 1/3) = 0.3889

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1456574.html

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

相关文章

nacos 2.3.1-SNAPSHOT 源码springboot方式启动(详细)附改造工程地址

文章时间是2024-2-18日,nacos默认develop分支,最新版是2.3.1-SNAPSHOT版本。 我们这里就以nacos最新版进行改造成springboot启动方式。 1. Clone 代码 nacos github地址:https://github.com/alibaba/nacos.git 根据上面git地址把源码克隆到…

wps快速生成目录及页码设置(自备)

目录 第一步目录整理 标题格式设置 插入页码(罗马和数字) 目录生成(从罗马尾页开始) ​编辑目录格式修改 第一步目录整理 1罗马标题 2罗马标题1一级标题 1.1 二级标题 1.2二级标题2一级标题 2.1 二级标题 2.2二级标题3一级标…

开源模型应用落地-工具使用篇-SLB(二)

一、前言 通过学习"开源模型应用落地"系列文章,我们成功地建立了一个完整可实施的AI交付流程。现在,我们要引入负载均衡,以提高我们的AI服务的性能和故障转移能力。本文将详细介绍如何使用腾讯云的负载均衡技术来将我们的AI服务部署…

网页脚本 bilibili004:字幕展示添加下载功能实现

效果 按钮显示 按钮hover 按钮点击 代码实现 在main函数中添加下载逻辑 getVideoName().then((resultObject) > {// 处理异步的Promise对象,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/thenaddDownloadButt…

Fiddler与wireshark使用

Fiddler解决三个问题 1、SSL证书打勾,解析https请求 2、响应回来乱码,不是中文 3、想及时中止一下,查看实时的日志 4、搜索对应的关键字 问题1解决方案: 标签栏Tools下 找到https,全部打勾 Actions里面 第一个 t…

沁恒CH32V30X学习笔记00--芯片概述

芯片概述 资源 系统框图 V303时钟树 V305/V307时钟 RISC-V4F 处理器 单精度浮点运算 处理器内部以模块化管理, 包含快速可编程中断控制器(PFIC) 内存保护 分支预测模式 扩展指令支持等单元 小端数据模式 多级硬件中断堆栈&#

ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整

文章目录 ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整获取音频长度pydub获取音频长度获取时长精确到秒格式设定 mutagen获取音频长度 调整音量视频音量调整注意事项 ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整 老王媳妇说上次那个pip挺好…

『运维备忘录』之 SSH 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等知识,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

OpenAI最新模型Sora到底有多强?眼见为实的真实世界即将成为过去!

文章目录 1. 写在前面2. 什么是Sora?3. Sora的技术原理 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感…

Linux-文件文件夹相关命令

目录 常见命令 1. 创建空目录:mkdir 文件夹名 2. 删除空目录:rmdir 文件夹名 3. 创建多级目录:mkdir -p 123/abc 4. 删除非空文件 rm -rf 文件夹名 5. 创建文件: touch 文件名.后缀 / vi 文件名.后缀 6. 删除文件&#x…

挑战杯 基于GRU的 电影评论情感分析 - python 深度学习 情感分类

文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖,适合作为竞…

Spring Boot java -jar --spring.profiles.active=dev 失效问题

之前动态部署修改配置文件的情况不多&#xff0c;所以也没注意过&#xff0c;这个问题今天困扰了好久&#xff0c;经过多方查询后得到了解决办法 直接上代码 <profiles><profile><!-- 本地开发环境 --><id>dev</id><properties><profi…

Codeforces Global Round 6

CF1266A Competitive Programmer 题目 给出n个数,问对于每个数,是否可以将这个数的数位重新组合(可以有前导零), 使其可以被60整除,若可以,则输出red,否则,输出cyan 分析 首先来看被60整除需要满足什么条件&#xff0c;因为602*3*10&#x…

2024年 前端JavaScript入门到精通 第一天 笔记

主要讲解JavaScript核心知识&#xff0c;包含最新ES6语法&#xff0c;从基础到API再到高级。让你一边学习一边练习&#xff0c;重点知识及时实践&#xff0c;同时每天安排大量作业&#xff0c;加深记忆&#xff0c;巩固学习成果。 1.1 基本软件与准备工作 1.2 JavaScript 案例 …

Spring MVC(基于 Spring4.x)基础学习

一、SpringMVC概述 二、SpringMVC的HelloWorld 三、使用RequestMapping映射请求 四、映射请求参数&请求头 五、处理模型数据 六、视图和视图解析器 七、RESTful CRUD 八、SpringMVC表单标签&处理静态资源 九、数据转换&数据格式化&数据校验 十、处理JSON:使用…

微信小程序:实现微信小程序应用首页开发 (本地生活首页)

文章目录 小程序应用页面开发1、创建项目并配置项目目录结构配置导航栏效果三、配置 tabBar 效果四、轮播图实现4.1 创建轮播图数据容器4.2 定义一个请求轮播图数据的接口4.3 页面加载调用 数据请求接口 五、九宫格实现5.1 获取九宫格数据5.2 结构和样式的完善六、图片布局实现…

MyBatisPlus 整合 SpringBoot 遇见的问题

【异常】&#xff1a;Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’… SQL: SELECT id,oper_id,btch_id,udf1, FROM scan_cyber Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’; ,"messag…

Python 实现 RSI 指标计算:股票技术分析的利器系列(4)

Python 实现 RSI 指标计算&#xff1a;股票技术分析的利器系列&#xff08;4&#xff09; 介绍算法解释 代码rolling函数介绍计算LCshift函数语法&#xff1a;参数&#xff1a;返回值&#xff1a; 计算涨跌幅函数MAX介绍语法&#xff1a;参数&#xff1a;返回值&#xff1a;示例…

小米4A路由器如何刷OpenWRT并结合内网穿透实现公网远程访问

文章目录 推荐前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理界面4.4 创建公网地址 5. 固定公网地址访问 推荐 前些天发现了一个巨牛的人工智…

USB-C音频转接器:实现边充电边听歌的新选择 | LDR6020P

随着科技浪潮的推进&#xff0c;Type-C接口已逐渐成为电子设备的主流选择&#xff0c;以其正反随意插、高速传输和强大功能等独特优势&#xff0c;在日常生活中占据越来越重要的地位。而Type-C音频转接器&#xff0c;作为连接Type-C接口与音频设备的桥梁&#xff0c;正引领着音…