依赖标签分类任务Smin值计算(蛋白质功能预测,GO标签)

devtools/2024/10/21 12:16:49/

前言

Smin是在蛋白质功能预测中比较流行的一个指标,具体由来我也不甚清楚,只是在最近复现的几篇论文中反复出现了,所以记录一下。

计算方法

(图来自于PSPGO论文)

其中𝜏表示阈值,t表示GO标签,Pa(t)表示该GO标签依赖父亲。

Prob(t|Pa(t))使用频率估算,是描述整个Protein-GO数据集的统计值。

Pi(𝜏)表示在阈值𝜏下的第i个蛋白质的预测GO集合,Ti表示第i个蛋白质实际GO标签集合。

这个计算流程比较复杂,得先用频率估计概率求出ic(相信大部分GO预测论文里面都有对应代码)

然后枚举Threshold值,对每个蛋白质计算 当前预测GO标签传递闭包 与 真实标签的传递闭包 的差集(Ti-Pi的差集和Pi-Ti的差集),统计这两部分的ic值各自的平均数,然后求这两个平均数的评分平均数作为S值。

最后找到最小的S值就是Smin了。

一些疑问的解答

1、为什么求传递闭包?

(什么是传递闭包?请看《离散数学》图论部分)

首先GO标签依赖关系是一个DAG(这里只考虑is_a和part_of关系,加入regulates之后就可能存在环了!)

然而一般数据库给出go.gaf文件都只是给出最具体的标签部分,更上层的GO标签未必有记录,但是有子标签必然是有父标签的,所以我们需要读取go.obo文件建立DAG图,然后求每个子标签的传递闭包的并,这才能得到一个蛋白质完整的GO标注数据。

2、ic值的计算

首先ic值也必须建立在所有蛋白质的GO标注都求过传递闭包的基础上。

在一个点有两个父亲的情况应该怎么办,例如:

在一些论文中,我们选取的是Prob(t|Pa(t))更大的作为这里标签的ic值(也就是选取父亲出现次数更少的进行计算)。另一些论文中可能会有不同的处理。

3、计算Smin的时候能否先对预测结果做一遍传递闭包?

复现论文是发现的细节,有些论文在计算Smin的时候巨慢无比,原来是每次都会把预测结果传递一遍再来求ru和mi值。

这样按照理论,得到的Smin值会更优一些,因为可以避免掉一些预测误差导致的中间某个GO标签缺失的情况。

实战来说,确实可以这么做,毕竟预测结果肯定是可以先传递一遍,再给别人拿去用的。

但有些老实的论文并没有做传递,得到的Smin值可能就会略有偏高。

4、关于Smin计算的优化

在复现PO2Vec论文时发现的问题,算一个thresh得花我十多分钟,实在受不了了,就给他优化了一把。

优化思路:提前保存每个GO标签的传递闭包结果,更改计算顺序,利用two-pointers计算每个蛋白质对各个阈值下的rumi的贡献。

在优化前,在swissprot数据集下,计算一次mf的Smin需要约10个小时,在优化后,只需要不到一个半小时。

主要优化的evaluate_cafa3.py中的evaluate_model_predicion函数。

def evaluate_model_prediction(labels, terms, model_preds, go_rels, ont):ru_list = []mi_list = list()# go setgo_set = go_rels.get_namespace_terms(NAMESPACES[ont])go_set.remove(FUNC_DICT[ont])# labelslabels = list(map(lambda x: set(filter(lambda y: y in go_set and y in terms, x)), labels))ancs = {}for go_id in tqdm(go_rels.ont,desc="calc ancs..."):ancs[go_id] = go_rels.get_ancestors(go_id)lim_set = go_set.intersection(terms)ru_list = [0]*101mi_list = [0]*101total = 0for x in labels:if len(x) > 0:total+=1assert len(labels) == len(model_preds)for label,pred_score in tqdm(zip(labels,model_preds)):tmp_lis = list(zip(pred_score,terms))tmp_lis.sort(reverse=True)j=0new_annots = set()for t in reversed(range(101)):threshold = t/100.0while j<len(tmp_lis) and tmp_lis[j][0]>threshold:new_annots |= ancs[tmp_lis[j][1]]j+=1new_annots = new_annots.intersection(lim_set)tp = new_annots.intersection(set(label))fp = new_annots - tpfn = label - tpfor go_id in fp:mi_list[t] += go_rels.get_ic(go_id)for go_id in fn:ru_list[t] += go_rels.get_ic(go_id)ru = np.array(ru_list)/totalmi = np.array(mi_list)/totalsmin = np.min(np.sqrt(ru * ru + mi * mi))return smin


http://www.ppmy.cn/devtools/127559.html

相关文章

Hive使用与介绍

Hive 是一个大数据处理工具,使用起来相对简单,主要是通过 HiveQL 查询语言与 Hive 数据库进行交互。以下是使用 Hive 的基本方法和步骤,包括如何安装 Hive、编写 HiveQL 查询,以及一些常用的操作示例。 1. Hive 安装与配置 Hive 依赖 Hadoop,必须先安装 Hadoop 并配置 H…

500强企业是如何进行数据安全建设的?看这篇就够了

500强企业对于数据安全的保护尤其重视&#xff0c;所以在数据安全建设方面通常采取多层次的策略&#xff0c;具体包括以下几个方面&#xff1a; l 风险评估与管理&#xff1a;定期进行全面的风险评估&#xff0c;识别数据安全风险&#xff0c;制定相应的管理策略。 l 安全政策…

linux命令之lspci用法

lspci 显示当前主机的所有PCI总线信息 补充说明 lspci命令 用于显示当前主机的所有PCI总线信息&#xff0c;以及所有已连接的PCI设备信息。 语法 lspci(选项)选项 -n&#xff1a;以数字方式显示PCI厂商和设备代码&#xff1b; -t&#xff1a;以树状结构显示PCI设备的层次…

Go语言依赖注入方式

在Go语言中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是一种设计模式&#xff0c;允许你将对象的依赖关系在外部进行管理&#xff0c;而不是让对象自己创建或查找依赖。通俗来说就是把一个对象所需要的东西如方法或属性&#xff08;统称…

Oracle10g运维 表增删改查

增两条数据&#xff0c;查一条数据&#xff0c;改一条数据&#xff0c;删除一条数据 INSERT INTO T_OWNERTYPE (ID,NAME) VALUES (1,居民); COMMIT; INSERT INTO T_OWNERS VALUES (1,张三,1,123,123,SYSDATE,1); COMMIT;SELECT * FROM T_OWNERS;UPDATE T_OWNERS SET NAME里斯…

《Vue3 版本差异》Vue3.5+ 在组件或HTML元素绑定 ref 差异

组件上的 ref&#xff0c;组合式写法的变化&#xff1b; 在 2024.09.03 发布的 v3.5.0 版上新增接口 useTemplateRef&#xff1b; v3.5 之前 代码第 8 行&#xff0c;导入 ref&#xff1b;代码第 10 行&#xff0c;使用 ref 传参为 null&#xff0c;变量名与 第三行 ref 同…

滚雪球学Redis[8.1讲]:Redis插件与扩展模块:模块化架构的强大扩展能力

全文目录&#xff1a; &#x1f389;前言&#x1f6a6;1. Redis Modules概述&#x1f3af;1.1 什么是Redis模块&#xff1f;&#x1fa80;1.2 Redis模块的核心功能 ⚙️2. 常用Redis模块介绍与使用&#x1f3d3;2.1 RedisSearch&#x1f3f8;2.2 RedisJSON&#x1f3b3;2.3 Red…

jmeter中对于有中文内容的csv文件怎么保存

jmeter的功能很强大&#xff0c;但是细节处没把握好就得不到预期的结果。今天来讲讲有中文内容的csv文件的参数化使用中需要注意的事项。 对于有中文内容&#xff0c;涉及到编码格式&#xff0c;为了让jmeter能正确地读取csv文件中的中文&#xff0c;需要把文件转码为UTF-8BOM…