本文通过Python语言实现SIR模型,并进行可视化,所用例子为足球俱乐部数据集。


@author:xiao黄
缓慢而坚定的生长


我之前还写过SI和IC模型的Python实现及可视化,请点击传送门查看,希望对你们有帮助。

SIR模型是传染病模型中最经典的一个。SIR是三个单词首字母的缩写,其中S是Susceptible的缩写,表示易感者;I是Infective的缩写,表示感染者;R是Removal的缩写,表示移除者。这个模型本身是在研究这三者的关系。在病毒最开始的时候,所有人都是易感者,也就是所有人都有可能中病毒;当一部分人在接触到病毒以后中病毒了,变成了感染者;感染者会接受各种治疗,最后变成了移除者。这三者的关系如下图所示:
β:易感节点被成功感染的概率
γ:感染节点被治愈的概率

代码:

import io
import random
import urllib.request as urllib
import zipfileimport matplotlib.pyplot as plt
import networkx as nx
import numpy as np'''
author:xiao黄
time:2020-9-26
''''''
1 易感人群(Susceptible):指未得病者,但缺乏免疫能力,与感病者接触后容易受到感染。
2 感染人群(Infective):指染上传染病的人,他可以传播给易感人群。
3 移除人群(Removed):被移出系统的人。因病愈(具有免疫力)或死亡的人。这部分人不再参与感染和被感染过程。
N(t) = S(t) + I(t) + R(t)
S(t+1) = S(t) - αS(t)
I(t+1) = I(t) - βI(t)
R(t+1) =  R(t) + βI(t)
'''max_iter_num = 200 # 模拟的次数
# G = nx.karate_club_graph() # 空手道俱乐部# 足球数据集
url = "http://www-personal.umich.edu/~mejn/netdata/football.zip"
sock = urllib.urlopen(url)
s = io.BytesIO(sock.read())
sock.close()
zf = zipfile.ZipFile(s)
gml = zf.read("football.gml").decode()
gml = gml.split("\n")[1:]
G = nx.parse_gml(gml) nums = G.number_of_nodes() # 足球数据节点 -> 115
print('总节点数',nums)alpha = 0.25 # 传染概率
beta = 0.65 # 治愈概率for edge in G.edges:G.add_edge(edge[0], edge[1], weight=random.uniform(0,1)) # 可不可以作为权值 病毒的感染能力
for node in G:G.add_node(node, state = 0) # 用state标识状态 state=0 易感 ,state=1 感染 , state=2 治愈seed = 'Arkansas' # 选定Arkansas作为传染源
G.node[seed]['state'] = 1 # 表示Arkansas是感染的 all_infect_nodes = [] # 所有被感染的节点放在这里
all_infect_nodes.append(seed)all_remove_nodes = [] # 所有被治愈的节点放在这里infect = [] # 随着迭代次数的增加的感染总人数
recover = [] # 随着迭代次数的增加的治愈总人数for i in range(max_iter_num):new_infect = list() # 新被感染的new_remove = list() # 新被治愈的# t1 = '%s time' % i + ' %s nodes' % len(all_infect_nodes)# print('当前感染节点数:', t1) # 当前有多少个节点被感染# t2 = '%s time' % i + ' %s nodes' % len(all_remove_nodes)# print('治愈节点数:', t2)infect.append(len(all_infect_nodes))recover.append(len(all_remove_nodes))# 感染的机会不止一次# 治愈后不会被感染for v in all_infect_nodes:for nbr in G.neighbors(v): # v的邻居if G.node[nbr]['state'] == 1: # 被感染edge_data = G.get_edge_data(v, nbr) # 得到边的权值if beta > edge_data['weight']: # 治愈概率G.node[nbr]['state'] == 2 # if nbr not in all_remove_nodes:new_remove.append(nbr)if G.node[nbr]['state'] == 0 :# 如果这个邻居节点没被感染且没有被治愈edge_data = G.get_edge_data(v, nbr)if alpha < edge_data['weight']:G.node[nbr]['state'] = 1new_infect.append(nbr)for i in new_remove:if i in new_infect:new_infect.remove(i)if i in all_infect_nodes: all_infect_nodes.remove(i)all_infect_nodes.extend(new_infect) # 将新感染的添加到all_remove_nodes.extend(new_remove)all_infect_nodes = list(set(all_infect_nodes)) # 去重all_remove_nodes = list(set(all_remove_nodes))# matplotlib中文支持
plt.rcParams['font.sans-serif'] = ['SimHei']  #aaaaa.py 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False  # 步骤二(解决坐标轴负数的负号显示问题)def draw_picture(nums,max_iter_num,infect,recover):x = range(max_iter_num)  susceptible =  []for i in range(max_iter_num):susceptible.append(nums - infect[i] - recover[i])plt.figure(figsize=(8,6), dpi=300) # 图片大小,清晰度plt.plot(x,infect, color='r', label='感染数', linestyle='--',)plt.plot(x,recover, color='b', label='治愈数') # 可以修改颜色、线条风格、图例plt.plot(x,susceptible,color='g',label='易感数')plt.legend(loc='upper right') # 显示图例plt.xticks(range(0,max_iter_num,20)) # 修改x的刻度plt.yticks(range(0,nums,10)) # 修改y的刻度# 添加网格显示plt.grid(True, linestyle='--', alpha=0.5)# 添加x,y轴描述信息及标题plt.ylabel('数量')plt.xlabel('天数')# plt.title('对比')plt.show()draw_picture(nums,max_iter_num,infect,recover)

代码运行结果:


有帮助的话,在这里点个赞再走呗~


信息传播模型——SIR的Python实现相关推荐

  1. python代码信息传播模型

    python代码信息传播模型是指使用python编写的程序来模拟信息传播的过程.这种模型可以用来研究信息如何在网络中传播,以及影响信息传播的因素. 例如,你可以使用python代码来模拟一个社交网络中 ...

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

    复杂网络研究中的传播模型SIR的Python实现 SIR 应用 SIR import random''' 程序主要功能 输入:网络图邻接矩阵,需要被设置为感染源的节点序列,感染率,免疫率,迭代次数st ...

  3. python代码实现, SIR 模型进行信息传播模拟

    SIR模型是一种常用的信息传播模型,它用来模拟传染病(如冠状病毒)的流行情况.SIR模型包括三种状态: S(Susceptible):易感者,还没有患上传染病的人. I(Infected):感染者,已 ...

  4. 《改进SIR 模型在社交网络信息传播中的应用》仿真实现

    摘要 基于<改进SIR 模型在社交网络信息传播中的应用>一文中提出的改进SIR模型,使用Matlab进行了仿真实现.另外,基于原文的模型,依据实际话题热度进行了其它仿真和分析. 背景 信息 ...

  5. 4 月 24 日开播!基于神经网络建模的信息传播预测

    信息传播在我们的日常生活中无处不在,例如谣言的扩散.产品的推广以及新思想和新技术的普及等等,其建模和预测已经在多个重要领域内得到了广泛的研究.近年来,很多研究者利用以循环神经网络为主的深度学习模型对信 ...

  6. 【综述专栏】陈恩红: 社交网络的信息传播分析及其应用

    本期聚焦中国科技大学陈恩红教授团队综述:社交网络信息传播分析中有哪些模型?如何基于网络结构评价用户的权威性和影响力?如何实现影响力最大化?未来还有哪些前景广阔的研究方向? Study on Infor ...

  7. 【文献综述】陈恩红: 社交网络的信息传播分析及其应用

    Study on Information Diffusion Analysis in Social Networks and Its Applications https://mp.weixin.qq ...

  8. 传染病传播模型(含matlab代码)

    2020年初,一种新型冠状病毒袭击了中国武汉. 随着卫生设施的改善.医疗水平的提高以及人类文明的不断发展,诸如霍乱.天花等曾经肆虐全球的传染性疾病已经得到有效的控制,但是一些新的.不断变异着的传染病毒 ...

  9. 【Python大作业】耦合网络信息传播

    文章目录 前言 一.题目介绍 二.解题思路 1.构造一个耦合网络 ①构造ER网络 ②构造BA网络 ③双层ER-BA网络模型 2.利用SIR模型来模拟信息传播 3.画图 三.完整代码 四.结果分析 1. ...

最新文章

  1. JS实现-页面数据无限加载
  2. 反对迭代0:停止拖延,开始迭代
  3. Neighbor-Vote:使用邻近距离投票优化单目3D目标检测(ACM MM2021)
  4. oppo8.0系统手机(亲测有效)激活xposed框架的教程
  5. JSR303数据校验-2021新版
  6. 互联网晚报 | 4月15日 星期五 | 360推出元宇宙产品“N世界”;四川多地下调房贷利率;知情人士:上汽或推动复工复产...
  7. Linux通过GPIO状态实现按键上报(按键功能)
  8. linux进程网络流量使用查询,linux centos 查看进程网络流量状态、网络流量(使用nethogs、nload)...
  9. 计算机vfp程序设计题,2012年计算机级VFP程序设计基础习题及答案.doc
  10. Python闭包基本介绍与作用
  11. TCP协议中的三次握手和四次挥手(图解)【转】
  12. maven的Lifecycle生命周期
  13. Java 病毒感染检测
  14. html中的flash打不开,浏览器中flash插件被屏蔽怎么办?
  15. 微信公众号前端支付实现
  16. 高德地图经纬度比较并返回范围内要求个数可用
  17. Lisp真的是屠龙之技吗?
  18. AndrewNG机器学习听课笔记(1 )——线性回归(linear regression)
  19. 九、cadence ic 5141 ——反相器版图绘制
  20. 如何解决下载链接在微信中无法打开的问题

热门文章

  1. 2021-2025年中国非结构蛋白4B行业市场供需与战略研究报告
  2. 中兴 ZTE T9 七寸平板手机ROOT方法 教程分享
  3. VSCode更改主题背景
  4. 用AkShare获取沪深京A股所有股票历史数据
  5. 一个人怎么写大型软件
  6. Java+Python 微信公众号自动给女朋友推送专属浪漫早安问候
  7. 计算机基础为什么要学word,计算机基础中word教学探讨
  8. 2020.9.10丨Pacbio技术三代建库、测序原理
  9. Html是网页制作的核心语言吗,html网页设计报告总结.doc
  10. C++实现“23”抽签小游戏