复杂网络研究中的传播模型SIR的Python实现

  • SIR
  • 应用

SIR

import random'''
程序主要功能
输入:网络图邻接矩阵,需要被设置为感染源的节点序列,感染率,免疫率,迭代次数step
输出:被设置为感染源的节点序列的SIR感染情况---每次的迭代结果(I+R)/n
'''def update_node_status(graph, node, beta, gamma):"""更新节点状态:param graph: 网络图:param node: 节点序数:param beta: 感染率:param gamma: 免疫率"""# 如果当前节点状态为 感染者(I) 有概率gamma变为 免疫者(R)if graph.nodes[node]['status'] == 'I':p = random.random()if p < gamma:graph.nodes[node]['status'] = 'R'# 如果当前节点状态为 易感染者(S) 有概率beta变为 感染者(I)if graph.nodes[node]['status'] == 'S':# 获取当前节点的邻居节点# 无向图:G.neighbors(node)# 有向图:G.predecessors(node),前驱邻居节点,即指向该节点的节点;G.successors(node),后继邻居节点,即该节点指向的节点。neighbors = list(graph.predecessors(node))# 对当前节点的邻居节点进行遍历for neighbor in neighbors:# 邻居节点中存在 感染者(I),则该节点有概率被感染为 感染者(I)if graph.nodes[neighbor]['status'] == 'I':p = random.random()if p < beta:graph.nodes[node]['status'] = 'I'breakdef count_node(graph):"""计算当前图内各个状态节点的数目:param graph: 输入图:return: 各个状态(S、I、R)的节点数目"""s_num, i_num, r_num = 0, 0, 0for node in graph:if graph.nodes[node]['status'] == 'S':s_num += 1elif graph.nodes[node]['status'] == 'I':i_num += 1else:r_num += 1return s_num, i_num, r_numdef SIR_network(graph, source, beta, gamma, step):"""获得感染源的节点序列的SIR感染情况:param graph: networkx创建的网络:param source: 需要被设置为感染源的节点Id所构成的序列:param beta: 感染率:param gamma: 免疫率:param step: 迭代次数"""n = graph.number_of_nodes()  # 网络节点个数sir_values = []  # 存储每一次迭代后网络中感染节点数I+免疫节点数R的总和# 初始化节点状态for node in graph:graph.nodes[node]['status'] = 'S'  # 将所有节点的状态设置为 易感者(S)# 设置初始感染源for node in source:graph.nodes[node]['status'] = 'I'  # 将感染源序列中的节点设置为感染源,状态设置为 感染者(I)# 记录初始状态sir_values.append(len(source) / n)# 开始迭代感染for s in range(step):# 针对对每个节点进行状态更新以完成本次迭代for node in graph:update_node_status(graph, node, beta, gamma)  # 针对node号节点进行SIR过程s, i, r = count_node(graph)  # 得到本次迭代结束后各个状态(S、I、R)的节点数目sir = (i + r) / n  # 该节点的sir值为迭代结束后 感染节点数i+免疫节点数rsir_values.append(sir)  # 将本次迭代的sir值加入数组return sir_values

应用

  • 更多应用请查看作者的其它博文 !

  • 计算n次独立实验中各方法SIR传播范围的平均值

    if __name__ == '__main__':# 读取网络数据# adj = np.loadtxt('adj.txt', dtype=np.int)  # 网络的邻接矩阵# edges = np.loadtxt('edges.txt', dtype=str)  # 网络的邻接表/边列表adj = np.loadtxt('adj.txt', dtype=np.int)  # 网络的邻接矩阵# 生成网络图(此处注意根据网络类型调整SIR代码中邻居节点的获取方式)# 无向图:graph = nx.from_numpy_matrix(adj) # 有向图:graph = nx.DiGraph(adj)# 根据连边生成网络:# 1. graph = nx.Graph()  # 生成网络图对象# 2. graph.add_edges_from(edges)  # 添加连边graph = nx.DiGraph(adj) # 创建有向图metheds = pd.read_csv('多方法排序.csv')  # 多种方法(a,b,c,d)的排序结果# 各方法的对应列method_a = metheds.iloc[:, 1]method_b = metheds.iloc[:, 2]method_c = metheds.iloc[:, 3]method_d = metheds.iloc[:, 4]'''初始化存储每次SIR传播范围的csv文件本代码中分别对Top-5,10,15的节点做实验'''for top_k in range(5, 20, 5):file = open('result/Top-' + str(top_k) + ' SIR.csv', "w", newline="")content = csv.writer(file)content.writerow(['a','b','c','d']) #写入文件列标题(各方法的名称)file.close()print('Top-' + str(top_k) + ' SIR.csv 已初始化!')'''进行n次实验取平均值'''n = 1000for i in range(n):print('第 ' + str(i + 1) + ' 次实验')for top_k in range(5, 20, 5):print('Top-' + str(top_k) + '...')# SIR参数设置beta = 0.15  # 感染率gamma = 0.5  # 免疫率step = 20  # 迭代次数# top-k序列source_a = method_a.argsort()[::-1][0:top_k]source_b = method_b.argsort()[::-1][0:top_k]source_c = method_c.argsort()[::-1][0:top_k]source_d = method_d.argsort()[::-1][0:top_k]# Top-k节点的感染情况sir_a = SIR_network(graph, source_a , beta, gamma, step)sir_b = SIR_network(graph, source_b , beta, gamma, step)sir_c = SIR_network(graph, source_c , beta, gamma, step)sir_d = SIR_network(graph, source_d , beta, gamma, step)# 存储每次实验的最终感染情况file = open('result/Top-' + str(top_k) + ' SIR.csv')reader = csv.reader(file)original = list(reader)file1 = open('result/Top-' + str(top_k) + ' SIR.csv', "w", newline="")content = csv.writer(file1)# 存储文件中的原始数据for row in original:content.writerow(row)# 存储新数据content.writerow([sir_a[step - 1], sir_b[step - 1], sir_c[step - 1], sir_d[step - 1]])file.close()file1.close()'''输出n次实验的平均值'''for top_k in range(5, 20, 5):sir_results = pd.read_csv('result/Top-' + str(top_k) + ' SIR.csv')  # 多种方法的排序结果print('Top-' + str(top_k) + ' SIR(Average)')print(sir_results.describe(include='all').loc['mean'])  # 输出数据特征```
    

复杂网络研究中的SIR传播模型(Python实现)相关推荐

  1. SIR传播模型的科普和预测

    >关注公众号:大数据技术派,回复`资料`,领取`1024G`资料. 注:本文仅是个人对于几个疾病模型做的一些概念性描述(科普),并进行了简单的编程实现.切勿当做现实的行动指导.因为文章内容原因, ...

  2. c++中recvfrom函数_通俗易懂:快速理解网络编程中5种IO模型

    关于IO模型,就必须先谈到几个日常接触的几个与IO相关名字:同步,异步,阻塞,非阻塞. 名词解释 同步 如果事件A需要等待事件B的完成才能完成,这种串行执行机制可以说是同步的,这是一种可靠的任务序列, ...

  3. 最优化在供应链网络设计中的应用:基于Python

    摘要 本博客旨在提供学生python版本的供应链网络设计的例子.案例研究来自苏尼尔•乔普拉(Sunil Chopra)和彼得•迈德尔(Peter Meindl)合著的<供应链管理>(The ...

  4. sir模型初始值_传播模型(SIR)

    #include#include#include#include#include#include #define MaxVertexNum 90000 #define RAND_MAX 0x7fff ...

  5. 使用Netlogo模拟SIR疾病传播模型

    最近在学习Netlogo软件,它的语言和之前学习的编程语言差别很大.看了模型库的代码才慢慢理解.以下是SIR传播模型的代码. 需要创建 按钮:setup, go 滑块:num-nodes, initi ...

  6. 脑科学研究中复杂网络测量使用和解释——图论指标详解

    脑网络研究中的图论指标详解 最全图论指标汇总 (1)度(node degree) (2)节点强度 (3)节点核心 (4)富人俱乐部系数(rich club coefficient) (5)同配系数 ( ...

  7. python人文社科研究_人文社科实证研究中问题与模型的关系

    在人文社科实证研究中,问题与模型的关系说起来大家都懂,但认识未必深刻,就像社会生活中的很多问题一样,别人一说,意思都懂,但要深刻领会,可能需要很长的时间.比如父母对子女的爱,孩子10几岁肯定能懂,但要 ...

  8. 复杂网络研究的机遇与挑战

    周涛1,张子柯2,陈关荣3,汪小帆4,史定华5,狄增如6,樊瑛6,方锦清7,韩筱璞2,刘建国8,刘润然2,刘宗华9,陆君安10,吕金虎11,吕琳媛2,荣智海1,汪秉宏12,许小可13,章忠志14 (1 ...

  9. 微软亚洲研究院成立OpenNetLab,探索以“数据为中心”AI网络研究新范式!

    2020年12月18日,微软亚洲研究院宣布联合清华大学.北京大学.南京大学.兰州大学.新加坡国立大学.首尔国立大学等多所亚洲地区高校,成立OpenNetLab开放网络平台联盟. OpenNetLab官 ...

最新文章

  1. 传文件进云服务器,传文件进云服务器
  2. Fegion-4解决Fegion第一次请求timeout的问题
  3. python与7无关的数输出格式第一行为所有与7无关的数_70 道 NumPy 测试题
  4. C++实现AOE网中的关键路径算法(邻接表存储)
  5. ListView条目中有CheckBox点击事件失效问题
  6. java togglebutton_ToggleButton和Switch使用大全
  7. 计算宝宝帐户收益(多重继承)_【067】遗漏因子、缺失数据与多重检验
  8. 关于线段树or 树状树状 在二维平面搞事情!Orz
  9. Ubuntu20.04安装ros教程(实测有用)
  10. MySQL的自定义函数
  11. linux下安装五笔输入法,Linux五笔输入法:小小输入法安装配置
  12. execl表格同时打开多个独立窗口编辑
  13. 计算机的垃圾站是在硬盘,电脑垃圾回收站在哪里
  14. HTML5期末大作业:仿唯品会购物网站设计——仿唯品会购物商城(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 商城网站设计
  15. 华为#S系列交换机和E系列交换机基于IP网段配置限速
  16. 如何将Oracle11g卸载干净
  17. 怎么样引流加人?引流加人有什么技巧?引流加人用什么好
  18. MySQL 5.7 OCP考试大纲
  19. 阿里云服务器企业型如何选择配置最佳?
  20. golang websocket简单实现

热门文章

  1. RH442-7 调度域和CPU集之一
  2. 走进前端,vscode插件的安装及使用
  3. redis __实现发布订阅
  4. java之一篇:java的执行顺序表象
  5. SEO 优化,网站推广优化教程100条(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)...
  6. IPU到底是个什么鬼?
  7. 微信h5登录php,vue实现微信授权登录步骤详解
  8. UVa 12627:Erratic Expansion(递推)
  9. android开发笔记之app应用间接使用frameworks接口
  10. RoboGuide学习笔记(一)——基本工作站的建立