复杂网络研究中的传播模型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. vasp算表面吸附流程_VASP实例分析表面吸附计算
  2. Keil中找不到芯片,往Keil中添加不存在的芯片,Keil安装pack文件
  3. 利用STM32 的串口来发送和接收数据实验
  4. android 保存数据到setting中_文章如何保存在数据库中
  5. 前后数据交互(ajax) -- 初始化页面表格
  6. 问题反馈信息处理平台开发过程
  7. 产品经理必知的数据指标
  8. 中文名称:程序员杂志2007精华本及附赠DVD光盘
  9. Python开发基础-day1
  10. IDEA 修改项目名称
  11. HashSet存储元素保证唯一性的代码及图解
  12. 广技师计算机毕业都去哪,广东哪间大学的计算机专业比较好???
  13. XML的注释踩坑记录
  14. Android音视频——H265编码核心技术解析
  15. day0学习开始,起于markdown
  16. hdp ambari Confirm Hosts 部署错误问题
  17. discuz 论坛不同版块使用不同模板
  18. omap 3530 SPI配置(MCSPI发送数据正常,读取数据全为0)
  19. python爬取boss直聘招聘信息_Python 爬取boss直聘招聘信息!
  20. 折半查找判定树 二叉排序树 查找成功平均查找长度 查找失败平均查找长度

热门文章

  1. 面试时该如何反问面试官问题?
  2. Oracle 一致性读和当前读
  3. 小学语文修改病句5句口诀及符号使用
  4. 基于tushare量化交易模型基础构建(偿债能力排名)
  5. 独立开发变现周刊(第80期):Notion页面转成网站客服小部件,月收入5K美金
  6. c语言如何重命名文件夹,VC 复制移动删除重命名文件文件夹
  7. win10 强制进入bios页面
  8. IDEA2022 创建基于Maven的SpringBoot聚合单应用项目
  9. linux恢复安卓数据,安卓数据恢复2 - ranfs的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. 第九章 我国农村个体工商业