基于长短期记忆神经网络的蛋白质二级结构预测

  • 问题描述
  • 数据来源
  • 数据的处理
  • 长短期记忆神经网络
  • 训练结果

问题描述

首先我们应该对对蛋白质二级结构有一定的了解,知道蛋白质二级结构预测指的是什么。蛋白质二级结构预测其实就是在蛋白质一级结构已知的情况下去预测该位置对应的二级结构。

数据来源

业界常用的数据集包括CB513数据集、CULLPDB数据集、CASP10数据集。

数据的处理

其实我个人觉得这个预测最为关键的一步就是数据的处理,数据处理的方法很大部分决定了预测的准确性。下面以CB513数据集为例:
首先到上面链接下载下载CB513数据集:
然后打开readme.txt文件:

可用看到该数据集目前是以numpy格式存储,可 以先将其重塑为(514 个蛋白×700 个氨基酸×57 特征)。也就是说它的数据结构是有 N 个矩阵,每个矩阵有 700 行,每行有 57 列,57 个列分别是:[0,22]列:氨基酸残基,顺序 为’A’,‘C’,‘E’,‘D’,‘G’,‘F’,‘I’,‘H’,‘K’ ,‘M’,‘L’,‘N’,‘Q’,‘P’,‘S’,‘R’,‘T’,‘W’,‘V’, ‘Y’,‘X’,‘NoSeq’ 、[22,31]列:二级结构标签,其序列为’L’,‘B’,‘E’,‘G’,‘I’,‘H’,‘S’,‘T’, ‘NoSeq’ 、[31,33]:N-和 C-终端、[33,35]:相对和绝对溶剂可及性,仅用于训练(绝对可 达性定为 15;相对可及性通过蛋白质中最大的可达性值归一化,阈值为 0.15;原始溶剂可 及性由 DSSP 计算)、[35,57]:22 位 PSSM 谱编码。[22,31]就是我们数据集的标签,他对 应的是’L’,‘B’,‘E’,‘G’,‘I’,‘H’,‘S’,‘T’,‘NoSeq’ 九种二级结构所对应的独热编码。[0,22] 就 是 21 种 氨 基 酸 和 一 种 未 确 定 氨 基 酸 对 应 的 正 交 编 码 , 比 如 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]表示 A(丙氨酸)。[35,57]22 位 PSSM 谱编码, 也是作为特征。也就是说特征包括 22 位正交编码和 22 位 PSSM 谱编码,标签是 9 位的二 级结构独热编码。可以将数据集划分80%用来训练,20%用来预测。
对于 CB513 数据集,由于前人已经将数据集处理成 N 蛋白乘上 k 特征的矩阵,所以我 只需要将数据 reshape 成(矩阵的长度链的长度特征属性的个数)的矩阵。在预测时我采用一种蛋白质二级结构预测常用的滑动窗口技术(滑动窗口的大小需要经过反复调整以达到最佳预测效果为止)。例如:

// 读取数据
input_data = np.load('D:/cb513+profile_split1.npy.gz','r')
//将数据reshape成所需要的格式
input_data = np.reshape(input_data, (514, 700, 57))
//[0-22]位是特征,也就是输入
x = input_data[:,:,0:22]
//[22-31]位是标签
y = input_data[:,:,22:31]
dataX = np.reshape(x, (len(x), 700, 22))

长短期记忆神经网络

本文采用的是长短期记忆神经网络来进行预测,构造该网络的方法有很多,我才此用的是keras来构造神经网络。

// 存放输入的数组
X = []
i = 0
j = 0
k = 0
//滑动窗口大小
window = 17
while i<((700-window+1)*514):if((j%(700-window+1)==0) and (j!=0)):j=0k+=1x = dataX[k,j:j+window,:]X.append(x)i+=1j+=1
X = np.reshape(X, (len(X), window, 22))
# print(len(X))
i = 0
j = 0
k = 0
//标签存放数组
Y = []
while i<((700-window+1)*514):if((j%(700-window+1)==0) and (j!=0)):j=0k+=1Y.append(y[k,j+8,:])i+=1j+=1
y = np.reshape(Y, (len(Y), 9))
print(len(y))
# # # 数据的划分
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.2)
模型的构建
model = Sequential()
model.add(Bidirectional(LSTM(32, dropout=0.5, recurrent_dropout=0.2,return_sequences = True),input_shape=(X.shape[1], X.shape[2])))
model.add(LSTM(32,dropout=0.5))
model.add(Dense(32))
model.add(Dropout(0.3))
model.add(Dense(16))
model.add(Dropout(0.3))
model.add(Dense(y.shape[1],use_bias=True))
model.add(Activation("sigmoid"))
model.compile(loss="binary_crossentropy", optimizer="rmsprop",metrics=["accuracy"])
网络训练
model.fit(Xtrain, ytrain, batch_size=32, epochs=80,validation_data=(Xtest, ytest))
# 模型验证
score, acc = model.evaluate(Xtest, ytest, batch_size=32)
print("\nTest score: %.3f, accuracy: %.3f" % (score, acc))

训练结果


可以看到预测的准确率非常的高,这是很不合理的,因为目前世界上最高的准确率也不过是80%出头。通过查看数据集的数据本身,可以发现数据集中有很多是属于 Noseq 的结构,而 NoSeq 是指 CB513 数据集把每一个蛋白质链都补成了长度为 700 个氨基酸,当一个链的氨基酸个数不足 700 时,数据集的创始者通过补 NoSeq 结构填补,也就是说 NoSeq 结构的预测准确率对整体准确率有影响,但是实际却是没有意义的,所以必须把 NoSeq 结构从 CB513 数据集中去掉,总体的准确率不应该包括 NoSeq 结构的准确率。 不包括 Noseq 结构准确率大概为 76.7%。

// 调整去掉Noseq结构,重新计算准确率![在这里插入图片描述](https://img-blog.csdn.net/2018101717233993?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MjE4MjU1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
acc1 = 0
acc2 = 0
acc3 = 0
acc4 = 0
sum1 = 0
sum2 = 0
sum3 = 0
sum4 = 0 for i in range(len(Xtest)):# idx = np.random.randint(len(X))xtest = Xtest[i,:,:].reshape(1,17,22)# print(xtest)ylabel = ytest[i,:]# print(ylabel)ypre = model.predict(xtest)[0,:]max = 0i = -1j = 0for y4 in ypre:if(y4>max):max = y4i+=1j = ielse:i+=1y1 = [0,0,0,0,0,0,0,0,0]y1[j] = 1if((y1==[0,1,0,0,0,0,0,0,0]) or (y1 == [0,0,1,0,0,0,0,0,0])):y1 = [1,0,0]else:if((y1==[0,0,0,1,0,0,0,0,0]) or (y1==[0,0,0,0,0,1,0,0,0])):y1 = [0,1,0]else:if(y1==[0,0,0,0,0,0,0,0,1]):y1 = [0,0,0]else:y1 = [0,0,1]if(y1!=[0,0,0]):print("预测:")print(y1)y2 = []for y3 in ylabel:y2.append(int(y3))if((y2==[0,1,0,0,0,0,0,0,0]) or (y2 == [0,0,1,0,0,0,0,0,0])):y2 = [1,0,0]sum2+=1# QEelse:if((y2==[0,0,0,1,0,0,0,0,0]) or (y2==[0,0,0,0,0,1,0,0,0])):y2 = [0,1,0]sum3+=1# QHelse:if(y2==[0,0,0,0,0,0,0,0,1]):y2 = [0,0,0]sum1+=1# NoSeqelse:y2 = [0,0,1]sum4+=1# QC if(y2!=[0,0,0]):print("标签:")print(y2)if((y1==y2==[1,0,0])):acc2+=1if((y1==y2==[0,1,0])):acc3+=1if((y1==y2==[0,0,1])):acc4+=1print((acc2+acc3+acc4)/(len(Xtest)-sum1))
print(acc2/sum2)
print(acc3/sum3)
print(acc4/sum4)

预测结果:

基于长短期记忆神经网络的蛋白质二级结构预测相关推荐

  1. 时序预测 | MATLAB实现基于EMD-LSTM时间序列预测(EMD分解结合LSTM长短期记忆神经网络)

    时序预测 | MATLAB实现基于EMD-LSTM时间序列预测(EMD分解结合LSTM长短期记忆神经网络) 目录 时序预测 | MATLAB实现基于EMD-LSTM时间序列预测(EMD分解结合LSTM ...

  2. 时序预测 | MATLAB实现基于Adam算法优化BiLSTM双向长短期记忆神经网络时间序列预测

    时序预测 | MATLAB实现基于Adam算法优化BiLSTM双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现基于Adam算法优化BiLSTM双向长短期记忆神经网络时间序列预测 ...

  3. 时序预测 | MATLAB实现基于Adam算法优化LSTM长短期记忆神经网络时间序列预测

    时序预测 | MATLAB实现基于Adam算法优化LSTM长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现基于Adam算法优化LSTM长短期记忆神经网络时间序列预测 效果一览 基本 ...

  4. 小白学深度之LSTM长短期记忆神经网络——深度AI科普团队

    前言 不知道RNN的一定要先看看RNN的原理 在RNN中我们说了RNN的不足,也就是对较长的时间,或者较长的string,很多时候前面的数据对后面的数据影响就很小甚至没影响了,这是我们就要加强前面的数 ...

  5. 时序预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络时间序列预测

    时序预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络时间序列预测 预测效果 基本 ...

  6. 回归预测 | MATLAB实现Bayes-LSTM(贝叶斯优化长短期记忆神经网络)多输入单输出

    回归预测 | MATLAB实现Bayes-LSTM(贝叶斯优化长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现Bayes-LSTM(贝叶斯优化长短期记忆神经网络)多输入单输出 基 ...

  7. 【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享...

    全文下载链接:http://tecdat.cn/?p=23544 在本文中,长短期记忆网络--通常称为"LSTM"--是一种特殊的RNN递归神经网络,能够学习长期依赖关系(点击文末 ...

  8. 回归预测 | MATLAB实现WOA-LSTM鲸鱼算法优化长短期记忆神经网络多输入单输出回归预测

    回归预测 | MATLAB实现WOA-LSTM鲸鱼算法优化长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-LSTM鲸鱼算法优化长短期记忆神经网络多输入单输出回归预测 ...

  9. Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

    原文链接:http://tecdat.cn/?p=23544  下面是一个关于如何使用长短期记忆网络(LSTM)来拟合一个不平稳的时间序列的例子. 每年的降雨量数据可能是相当不平稳的.与温度不同,温度 ...

  10. 分类预测 | MATLAB实现CNN-LSTM(卷积长短期记忆神经网络)多特征分类预测

    分类预测 | MATLAB实现CNN-LSTM(卷积长短期记忆神经网络)多特征分类预测 目录 分类预测 | MATLAB实现CNN-LSTM(卷积长短期记忆神经网络)多特征分类预测 预测效果 基本介绍 ...

最新文章

  1. Python 技术篇 - 文件的读取和写入
  2. 三、开发调试应用程序
  3. SqlServer基础之(触发器)
  4. 比原链Bytom错误码一览
  5. 经典C语言程序100例之八
  6. PHP传引用/作用域 问题
  7. 创建您的第一个servlet
  8. 理解typedef(转)
  9. 群晖安装pdo_mysql_使用docker方式部署禅道
  10. 【SSH网上商城项目实战01】整合Struts2、Hibernate4.3和Spring4.2
  11. snprintf的返回值代表字节数 != 实际写入字节数
  12. 即席查询之Presto
  13. win7打印机显示服务器脱机怎么办,手把手教你设置win7系统网络打印机脱机的修复教程...
  14. 双屏怎么快速切换鼠标_Win7系统如何设置一键快速切换双屏显示(图文)
  15. 一位10年 Java 工作经验的架构师聊 Java 和工作经验
  16. 编程思想的理解(POP,OOP,SOA,AOP)
  17. android解析包时出现问题怎么解决方法,安装APK软件时发生“解析包时出现错误”的9大解决方法...
  18. VPS云主机是什么?有什么优势?
  19. 【课程】04 土壤水动力学
  20. 阿龙的学习笔记---Linux GDB 调试工具(博客转载总结)

热门文章

  1. Layer Emitter(图层发射器)
  2. 光伏龙头们掀起垂直一体化狂潮
  3. docker镜像(第二天)
  4. 【每日一P】简单实用的调色原理
  5. SCARA——OpenGL入门学习五六(三维变换、动画)
  6. 华为任命徐直军为华为云董事长,余承东任CEO | 任正非:做事要充满霸气,做人一定要谦卑!...
  7. pandoc 转换html,pandoc将markdown转换输出HTML slide
  8. 彻底掌握基于HTTP网络层的 “前端性能优化“
  9. rbc系统基于通用服务器构建的,列控核心设 RBC系统介绍.doc
  10. Main concerns of fDSST tracker