Emvirus: 基于 embedding 的神经网络来预测 human-virus PPIs【Biosafety and Health,2023】
研究背景:
- Human-virus PPIs 预测对于理解病毒感染机制、病毒防控等十分重要;
- 大部分基于 machine-learning 预测 human-virus PPIs 的方法利用手动方法处理序列特征,包括统计学特征、系统发育图谱、理化性质等;
- 本文作者提出了一个名为
Emvirus
的方法,它利用Doc2Vec
获取蛋白序列特征,并将序列特征输入到由 CNN 和 Bi-LSTM 构成的网络中预测 human-virus PPIs;
数据集构成:
- 正样本 human-virus PPIs 来自 Yang et.al 收集的多个来源(包括 PHISTO,VirHostNet,VirusMentha,HPIDB,PDB以及一些实验数据)的 PPIs,去掉重复的和无统计学显著性的 PPIs 之后,最终得到 27493 对正样本 PPIs。
- 负样本 human-virus PPIs 来自 Yang et.al 中使用的基于 dissimilarity‐based negative sampling method 构建的负样本 PPIs。
- 正样本:负样本 = 1:10
- 训练集:测试集 = 20:1
- 对于数据集中样本类别不平衡的处理办法:作者利用 SMOTE 方法对正样本进行过采样,构建 balanced training datasets。
研究思路和方法:
论文代码:https://github.com/hongjiala/PPIs
1. 利用 Doc2vec
获取蛋白质序列的特征向量:
Doc2vec
是NLP中Word2vec
方法的拓展,相比于 Word2vec
,Doc2vec
可以从不同长度的蛋白序列中学到固定长度的序列特征表示。
(至于图中蛋白向量形状为 1x3000,暂时没想清楚怎么来的)
#【本段代码来自 作者提供的 doc2vec/doc2vec.py,我只是添加了一些注释信息。】# -*- coding: utf-8 -*-
"""
Created on Tue May 26 18:19:53 2022@author: xiepengfei
"""import numpy as np
from Bio import SeqIO
from nltk import trigrams, bigrams,ngrams ## 用来给氨基酸序列进行分词
from keras.preprocessing.text import Tokenizer
from gensim.models import Word2Vec
import re
from gensim.models.doc2vec import Doc2Vec, TaggedDocument ## 用于 embedding
from gensim.test.utils import get_tmpfilenp.set_printoptions(threshold=np.inf)## 将 每条氨基酸序列 划分成小片段,之间以空格分开,并将每一个病毒中的所有的序列保存在 texts 列表中
names = ["DENV","Hepatitis","Herpes","HIV","Influenza","Papilloma","SARS2","ZIKV"] ## 有这些病毒的序列,每个病毒序列都单独处理,训练embdding模型
for name in names:texts = []for index, record in enumerate(SeqIO.parse('fasta/%s.fasta'%name, 'fasta')):tri_tokens = ngrams(record.seq,6) ## 将蛋白质序列连续分割成长度为6的片段temp_str = ""for item in ((tri_tokens)): ## item 就是每一条氨基酸序列的片段,格式 ("A","B","C","D","E","F"), ("B","C","D","E","F","G"), ("C","D","E","F","G","H")# print(item),items = "" ## items 就是将每个片段中的氨基酸残基字符拼接成一个字符串,即 "ABCDEF", "BCDEFG", "CDEFGH"for strs in item:items = items+strstemp_str = temp_str + " " + items ## 将氨基酸片段字符串拼起来,之间以空格分开,即 "ABCDEF BCDEFG CDEFGH"#temp_str = temp_str + " " +item[0]texts.append(temp_str) ## 将 temp_str 保存到 texts 中,格式:["ABCDEF BCDEFG CDEFGH", "ABCDEF BCDEFG"]## 将 texts 中保存的氨基酸序列中的一些特殊字符(stop中列举的特殊字符)去掉,结果保存在 seq 中 (seq中的内容和texts中的内容的区别就是前者没有那些特殊字符)seq=[]stop = '[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]+'for doc in texts:doc = re.sub(stop, '', doc)seq.append(doc.split())documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(seq)] ## 将 seq 列表中的每条序列转化为 TaggedDocument对象,words就是每条序列doc,tags就是序列的索引[i]model = Doc2Vec(documents , vector_size=1000, window=500, min_count=1, workers=12) ## 构建 Doc2vec 模型model.train(documents ,total_examples=model.corpus_count, epochs=50) ## 训练模型#model.save("autodl-tmp/my_doc2vec_model.model") # you can continue training with the loaded model!#model.dv.save_word2vec_format('%s.vector'%name)# test_seq = ['MRQGCKFRGSSQKIRWSRSPPSSLLHTLRPRLLSAEITLQTNLPLQSPCCRLCFLRGTQAKTLK']# # test_text = ngrams(test_seq,6)# # temp_str_test = ""# # for item in ((test_text)):# # # print(item),# # print(item)# # items = ""# # for strs in item:# # items = items+strs# # temp_str = temp_str_test + " " + items# inferred_vector_dm = model.infer_vector(test_seq)# print(inferred_vector_dm)np.save("vec/new_%s_vector.npy"%name,model.dv.vectors) ## 保存特征向量
2. 将 human-virus PPI pairs 转化为 feature vector pairs
将 human 的蛋白向量、virus 的蛋白向量、标签放到一起。
如下代码所示:(详情见:https://github.com/hongjiala/PPIs/blob/master/pair/form_pair_data.py)
3. 用 SMOTE 方法对正样本进行过采样:
这部分代码是用MATLAB写的,看不太懂。详情见:https://github.com/hongjiala/PPIs/tree/master/smote
关于SMOTE的原理(参考:arXiv:1106.1813):
This paper shows that a combination of our method of over-sampling the minority (abnormal) class and under-sampling the majority (normal) class can achieve better classifier performance (in ROC space) than only under-sampling the majority class.
This approach is inspired by a technique that proved successful in handwritten character recognition (Ha & Bunke, 1997). They created extra training data by performing certain operations on real data. In their case, operations like rotation and skew were natural ways to perturb the training data.
We generate synthetic examples in a less application-specific manner, by operating in “feature space” rather than “data space”.
The minority class is over-sampled by taking each minority class sample and introducing synthetic examples along the line segments joining any/all of the k minority class nearest neighbors. Depending upon the amount of over-sampling required, neighbors from the k nearest neighbors are randomly chosen.
简单来说的话就是:在原始样本的 “feature space” 中某个样本点 i i i的最近邻的 k k k个样本点中随机的一个点 n n nn nn,计算 n n nn nn和 i i i在 “feature space” 中的特征差值 d i f dif dif,然后生成0-1之间随机数 g a p gap gap,则新生成的样本点 n e w i n d e x newindex newindex的特征值 = i i i的特征值 + g a p gap gap * d i f dif dif
4. 构建模型:
由 CNN、Attention 和 Bi-LSTM 构建模型,详情见(https://github.com/hongjiala/PPIs/blob/master/train/model_protein.py)
5. 训练并测试模型:
详情见:https://github.com/hongjiala/PPIs/tree/master/train
实验结果及讨论:
作者对每一种病毒都用相同的神经网络框架分别训练了一个模型,每个病毒对应的模型的预测结果:
1. 各模型对各自的 human-virus PPIs 预测结果:
2. 不同特征及不同模型对各病毒的 human-virus PPIs 预测结果:
3. 各模型跨病毒的 human-virus PPIs 预测结果:
讨论:
- 基于 Doc2Vec + CNN + Bi-LSTM 的方法构建的模型,并以不同病毒的 human-virus PPIs 数据分别对模型进行训练,除了某些病毒以外,大部分的病毒的模型的预测效果挺好的。
- 与手动抽取序列特征的方法(如 PSSM,LD,CT,AC等)相比,用 Doc2Vec 可以更好地获取序列特征。
- 用不同病毒的 PPIs 数据训练的模型在进行跨病毒的 human-virus PPIs 预测的时候,模型基本没有分辨能力,即模型的泛化能力较差,可能是由于不同病毒的 human-virus PPIs 的数据分布或者特征组成差别较大导致的。
- 整体上而言,Doc2Vec + LSTM 可以对某些特定的病毒实现比较好的 human-virus PPIs 预测。
相关文章:

Emvirus: 基于 embedding 的神经网络来预测 human-virus PPIs【Biosafety and Health,2023】
研究背景: Human-virus PPIs 预测对于理解病毒感染机制、病毒防控等十分重要;大部分基于 machine-learning 预测 human-virus PPIs 的方法利用手动方法处理序列特征,包括统计学特征、系统发育图谱、理化性质等;本文作者提出了一个…...

安全文件传输:如何降低数据丢失的风险
在当今数字化时代,文件传输是必不可少的一项工作。但是,数据丢失一直是一个令人头疼的问题。本文将探讨一些减少数据丢失风险的方法,包括加密、备份和使用可信的传输协议等。采取这些措施将有助于保护数据免受意外丢失的危险。 一、加密保护数…...

AI绘画StableDiffusion实操教程:可爱头像奶茶小女孩(附高清图片)
本教程收集于:AIGC从入门到精通教程汇总 今天继续分享AI绘画实操教程,如何用lora包生成超可爱头像奶茶小女孩 放大高清图已放到教程包内,需要的可以自取。 欢迎来到我们这篇特别的文章——《AI绘画StableDiffusion实操教程:可爱…...
java8 GroupingBy 用法大全
java8中,Collectors.groupingBy 会用得比较多,对其常见用法做一个汇总 1,模拟数据 Item import java.math.BigDecimal;public class Item {private String name;private Integer quantity;private BigDecimal price;public Item(String nam…...
vue_router__WEBPACK_IMPORTED_MODULE_1__.default is not a constructor
你所建立的项目 是 vue2x ,但是却下载了 vue-router4x 而 vue-router4x 适用于 vue3x 所以你需要卸载 vue-router4x,重新下载 vue-router3x 卸载: npm uninstall vue-router 安装:(3版本) npm i vue-router3...
前端html2canvas和dom-to-image实现截图功能
目录 需求 历劫过程 截图知识点 html2canvas 文档地址 封装 使用教程 dom-to-image-more 文档地址 封装 使用教程 解决跨域问题 以下是我花了大把时间,薅秃头得出来的最终结果, dom-to-image-more截图时间快到可以让复杂的页面仅需2-3S就能完成截图,内容有点多…...
Hadoop平台集群之间Hive表和分区的导出和导入迁移(脚本)
要编写Shell脚本实现两个Hadoop平台集群之间Hive表和分区的导出和导入迁移 你可以使用Hive的EXPORT和IMPORT命令结合Hadoop的DistCp命令。下面是一个示例脚本: #!/bin/bash# 导出源Hive表的数据到HDFS source_hive_table"source_db.source_table" targe…...

Linux C语言实践eBPF
手动编译了解过程 通过对关键步骤make Msamples/bpf的实践,我们已经可以编译出内核源码中提供的ebpf样例。但这还不够我们充分地理解这个编译过程,我们将这编译过程拆解一下,拆解成可以一步步执行的那种,首先是环境准备ÿ…...

垃圾回收标记阶段算法
1.标记阶段的目的 主要是在GC在前,判断出哪些是有用的对象,哪些是需要回收的对象,只有被标记为垃圾对象,GC才会对其进行垃圾回收。判断对象是否为垃圾对象的两种方式:引用计数算法和可达性分析算法。 2.引用计数算法…...

泰晓科技发布 Linux Lab v1.2 正式版
导读近日消息,Linux Lab 是一套用于 Linux 内核学习、开发和测试的即时实验室,官方称其“可以极速搭建和使用,功能强大,用法简单”。 自去年 12 月份发布 Linux Lab v1.1 后,v1.2 正式版目前已经发布于 GitHub 及 Gite…...

王道数据结构-代码实操1(全注解版)
#include<stdio.h>void loveyou(int n){ // 传入参数类型为int型,在此函数中表示为n;返回值类型为void,即没有返回值; int i1; //定义了一个整数型变量i,且只在loveyou函数中有用;while(i…...

flink写入到kafka 大坑解析。
1.kafka能不能发送null消息? 能! 2 flink能不能发送null消息到kafka? 不能! public static void main(String[] args) throws Exception {StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(…...
MATLAB算法实战应用案例精讲-【深度学习】预训练模型-Subword
目录 前言 Subword 1. Subword介绍 分词器是做什么的? 为什么需要分词? 分词方法...
【HarmonyOS】实现从视频提取音频并保存到pcm文件功能(API6 Java)
【关键字】 视频提取类Extractor、视频编解码、保存pcm文件 【写在前面】 在使用API6开发HarmonyOS应用时,通常会开发一些音视频媒体功能,这里介绍如何从视频中提取音频保存到pcm文件功能,生成pcm音频文件后,就可使用音频播放类…...

Linux:shell命令运行原理和权限的概念
文章目录 shell和kernelshell的概念和原理Linux的权限文件的权限文件的类型文件的权限管理权限的实战应用 shell和kernel 从狭义上来讲,Linux是一个操作系统,我们叫它叫kernel,意思是核心,核心的意思顾名思义,就是最关…...
Javascript -- 数组prototype方法探究
一、数组prototype方法探究 1、不改变原数组 1. concat() 这个是数组拼接方法,可以将两个数组或多个数组拼接并返回一个包含两个数组或多个数组内容的新数组,不会改变原数组 方法里面理论上可以写入n个参数, const arr [1,2]; var str …...

android stduio 打开工程后直接报Connection refused解决
报错如下:Connection refused 解决方案: 打开gradle-wrapper.properties修改distributionUrl 将: distributionUrlhttp\://localhost/gradle/distributions/gradle-6.5-bin.zip 替换为: distributionUrlhttps\://services.gradle.org/distributions/gradle-6.5-bin.zip 错…...

搜索与图论(一)
一、DFS与BFS 1.1深度优先搜索(DFS) DFS不具有最短性 //排列数字问题 #include<iostream> using namespace std;const int N 10; int n; int path[N]; bool st[N];void dfs(int u) {if(u n){for(int i 0;i < n;i) printf("%d",path[i]);puts("&qu…...

百题千解计划【CSDN每日一练】“小明投篮,罚球线投球可得一分”(附解析+多种实现方法:Python、Java、C、C++、C#、Go、JavaScript)
这个心上人,还不知道在哪里,感觉明天就会出现。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博主🏅 🏆[4] CSDN-人工智能领域优质创作者�…...
lemon框架开发笔记
lemon框架开发笔记 JudgeUtils.isBlank() 字符串为 null 或者 "" ----返回true JudgeUtils.isNotBlankAll() 字符串全部不为 null 或者 "" ----返回true JudgeUtils.isBlankAll() 字符串全部为 null 或者 "" ----返回true// isBlank 是在isEmpt…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...