文章目录

  • 算法描述
  • 设计思想
  • 源代码及运行结果
    • 运行结果
    • 源代码
  • 总结

算法描述


重启随机游走算法(Random Walk with Restart)
重启随机游走算法是在随机游走算法的基础的改进。从图中的某一个节点出发,每一步面临两个选择,随机选择相邻节点,或者返回开始节点。算法包含一个参数a为重启概率,1-a表示移动到相邻节点的概率,经过迭代到达平稳,平稳后得到的概率分布可被看作是受开始节点影响的分布。

设计思想

要求实现:

1. 获得相互作用数最多的蛋白质P
2. 预测与P相互作用的Top-20蛋白质
3. P在五折交叉验证下的ROC

设计思想:

  1. 解析文本数据获取相互作用数最多的蛋白质P及相关作用关系矩阵
  2. 初始化r0向量,进行迭代计算,迭代10次后(10次是因为PageRank迭代10次后基本稳定)分析r的值得到与P相互作用的Top-20蛋白质
  3. 随机将与蛋白质P相互作用的蛋白质分成5个子集,依次将其相互作用抹去,进行计算r并画出ROC曲线

源代码及运行结果

运行结果

运行结果如下:

源代码

代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import numpy as np
import copy
import matplotlib.pyplot as plt# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False#计算PR值
def calPR(W,connectionNum,proteinNum,maxIndex):W = W / connectionNum #归一化r = np.zeros(proteinNum) # 初始化r向量r[maxIndex] = 1r = np.mat(r).transpose()r2 = copy.deepcopy(r)W = np.mat(W)a = 0.85for i in range(10):#设置迭代次数:10r1 = copy.deepcopy(r2)r2 = a * W * r1 + (1 - a) * rreturn r2# n*1维矩阵转换为列表
def matrixTolist(matrix):list = matrix.transpose().tolist()list = [i for ind in list for i in ind]return listfilename = 'BINARY_PROTEIN_PROTEIN_INTERACTIONS.txt'
allprotein = [] # 存储所有蛋白质
relation  = [] # 存储蛋白质结构相互作用关系
with open(filename, 'r') as f:while True:lines = f.readline()  # 整行读取数据if not lines:breakpassallprotein.append(lines.split()[0])allprotein.append(lines.split()[3])# 存储蛋白质数据relation.append((lines.split()[0],lines.split()[3])) # 存储蛋白质结构相互作用关系allprotein = list(set(allprotein))relation = list(set(relation))
proteinNum = len(allprotein)
W = np.zeros((proteinNum,proteinNum)) # 构建蛋白质相互作用关系矩阵
for rel in relation:W[allprotein.index(rel[0]),allprotein.index(rel[1])] = 1W[allprotein.index(rel[1]), allprotein.index(rel[0])] = 1W0 = copy.deepcopy(W)
connectionNum = W.sum(axis = 0) # 计算每个蛋白质的相互作用数
maxConnectionNum = np.max(W.sum(axis = 0))
index = np.argmax(W.sum(axis = 0)) # 获取相互作用最多的蛋白质P及作用数及索引
maxProtein = allprotein[index]
print("======================================")
print("相互作用最多的蛋白质为:",maxProtein)
proteinLabel = W[:,index]
r2 = calPR(W,connectionNum,proteinNum,index)
#与P有相互作用Top20蛋白质
maxTwentyIndex = matrixTolist(r2)
maxTwentyIndex = np.argsort(maxTwentyIndex)[-21:] # 排序获取前20蛋白质
maxTwentyIndex = maxTwentyIndex[::-1]
print("======================================")
print("与" + maxProtein + "相互作用Top20蛋白质:")
rank = 1
for ind in maxTwentyIndex:if allprotein[ind] != maxProtein:print(rank ,":",allprotein[ind])rank += 1#五折交叉验证并画出ROC曲线
nonZeroIndex = np.nonzero(proteinLabel)[0].tolist() # 获取标签值不为0的索引 即正例索引值
testIndex = [] # 存储每次测试样本的索引
for j in range(5):eachTestIndex = [nonZeroIndex[ind] for ind in np.random.choice(len(nonZeroIndex),int(maxConnectionNum/5),replace=False)] # 5次依次随机抽取正例测试样本testIndex.append(eachTestIndex)nonZeroIndex = list(set(nonZeroIndex) - set(eachTestIndex)) # 将本次随机抽取的样本删除以免测试样本重复
xFPR = [] # 存储每次交叉验证的FPR和TPR
yTPR = []
for eachTest in testIndex: # 分别5次计算FPR和TPRW1 = copy.deepcopy(W0)for eachInd in eachTest: # 重置测试样本的相互作用关系W1[eachInd,index] = 0W1[index,eachInd] = 0connectionNum2 = W.sum(axis=0)R = calPR(W1,connectionNum2,proteinNum,index)zeroIndex = np.where(proteinLabel == 0)[0].tolist() # 获取标签值为0的索引 即反例索引值allTestIndex = eachTest + zeroIndex # 所有测试集的索引值R = matrixTolist(R)R = [R[i] for i in range(len(R)) if (i in allTestIndex)] # 去除非测试集的数据testProtein = [allprotein[i] for i in range(len(allprotein)) if (i in allTestIndex)] # 测试集数据对应的蛋白质testProteinP = [allprotein[i] for i in range(len(allprotein)) if (i in eachTest)] # 正例蛋白质集testProteinN = [allprotein[i] for i in range(len(allprotein)) if (i in zeroIndex)] # 反例蛋白质集proteinR = dict(zip(testProtein,R)) # {蛋白质 - r} 键值对orderProteinR = sorted(proteinR.items(),key = lambda x : x[1] ,reverse=True) # 进行排序orderProtein = [p[0] for p in orderProteinR] # 排序后的蛋白质x = [] # 每条ROC曲线的x值y = [] # 每条ROC曲线的y值for i in range(len(orderProtein)): # 进行计算 : 依次将第i个值作为阈值predictP = orderProtein[:i+1] # 预测正例为前i个predictN = orderProtein[i+1:] # 预测反例为第i+1个到最后一个TP = len(set(predictP) & set(testProteinP)) # 真正例数TPR = TP/len(testProteinP)FPR = 1 - len(set(predictN) & set(testProteinN))/len(testProteinN) # 假正例率 = 1 - 真反例率x.append(FPR),y.append(TPR)xFPR.append(x),yTPR.append(y)for i in range(5):label =  "第" + str(i + 1) + "次测试"plt.plot(xFPR[i],yTPR[i],alpha = 0.8,label = label)
plt.xlabel("FPR")
plt.ylabel("TPR")
plt.legend()
plt.show()

总结

这次算法实现的难点主要在于理解,最初实现时尝试采用PageRank思想理解这个预测过程,发现虽然PageRank和重启随机游走公式相同,但思想还是不太一样,又因为查找到有关重启随机游走算法的资料非常少而且不太容易理解,这就导致最初对于如何实现毫无头绪。

但在理解整个算法后实现起来并没有太大的问题,只是因为数据集略大导致跑完所有代码需要一点时间,如何存储数据并且改进算法使其提高效率非常需要优化的一点。实现过程中对于如何随机选取测试样本进行五折交叉验证并且画出ROC曲线上花了点时间,最后想出了自认为比较满意且简单的方法。

众多不足,日后改进。

3.利用PageRank(重启随机游走)预测蛋白质相互作用相关推荐

  1. 重启随机游走算法(RWR:Random Walk with Restart)

    重启随机游走算法(RWR:Random Walk with Restart) 1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决 ...

  2. 重启随机游走算法(RWR)

    重启随机游走算法(Random Walk with Restart) 1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决.在互联 ...

  3. 重启随机游走(RWR)算法

    RWR介绍 Random Walk with Restart(RWR) RWR是最早提出的一种用于图像分割的算法.它迭代地探索网络的整体结构,以估计两个节点之间的接近度(亲和力分数). 从一个节点开始 ...

  4. 图神经网络-随机游走

    1. Random Walk with Restart(RWR): 带重启的随机游走算法 参考博客: Random Walk with Restart and its application 参考博客 ...

  5. 论文浅尝 | 利用多语言 wordnet 上随机游走实现双语 embeddings

    论文笔记整理:谭亦鸣,东南大学博士生,研究方向为知识图谱问答. 来源:Knowledge Based System 链接:https://www.sciencedirect.com/science/a ...

  6. python二维随机游走_利用python进行时间序列分析——从随机游走到GARCH模型(二)...

    Autoregressive Models - AR(p) 当因变量能由它的多个滞后项表示就叫做自回归性.公式如下: 当我们描述模型的阶数,比如,AR模型的阶数为怕p,p代表在这个模型里用的滞后数量. ...

  7. garch模型python步骤_利用python进行时间序列分析——从随机游走到GARCH模型(二)...

    Autoregressive Models - AR(p) 当因变量能由它的多个滞后项表示就叫做自回归性.公式如下: 当我们描述模型的阶数,比如,AR模型的阶数为怕p,p代表在这个模型里用的滞后数量. ...

  8. [转载] 随机游走和随机重启游走_网络动画API的随机游走

    参考链接: 随机游走(Python实现) 随机游走和随机重启游走 I'm currently writing a demo that will use a small repeated random ...

  9. garch模型python步骤_利用python进行时间序列分析——从随机游走到GARCH模型(一)...

    本文是主体是翻译Time Series Analysis (TSA) in Python - Linear Models to GARCH.但是文章主要是python操作,而理论较少,因此在此基础上补 ...

最新文章

  1. Cassandra读写性能测试
  2. ASP.NET Core 2.1带来SignalR、Razor类库
  3. 首尔日记——5月25日,出发
  4. java mysql jsp分页_JSP+MYSQL+Java类优化分页的实例
  5. cordova 5.0版本说明
  6. Linux配置yum源(离线和在线)
  7. Mysql、navicat、SQL server 的关系
  8. 公司的高管,每天都在做什么?
  9. govendor用法
  10. 2019ICPC亚洲区域赛(南京) C-Digital Path 题解
  11. android:scrollbars代码控制,android:scrollbars属性和弹出键盘的问题
  12. 多线程1-Thread
  13. 【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
  14. python2 + django 导出 excel 功能 接口示例代码(做记录)
  15. ARM官方汇编与ARM GNU汇编中的伪操作
  16. CMWAP 和 CMNET
  17. JavaScript中的参数传递
  18. 你离拍出好的雪景作品,还有多远? @教摄影
  19. 数据库系统概念 | 第三章:SQL介绍
  20. Windows XP Professional With SP3 VOL[MSDN原版]+正版密钥

热门文章

  1. 通过PS把月亮“搬”到自己的床上
  2. MySQL,Oracle系统学习,以及SQL语言-----数据库篇学习笔记
  3. Eclipse SVN文件对比详解
  4. 在人一生的成长过程中,什么才是最重要的因素?
  5. Bugku杂项——图穷匕见
  6. 毒液蛋白质相互作用分析
  7. codec基础知识的学习
  8. Factorials
  9. Factors of Factorial
  10. 在面试时候,如何简明扼要简述产品流程