信息传播模型——SIR的Python实现

article/2025/9/26 9:02:42

本文通过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)

代码运行结果:
在这里插入图片描述


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



http://chatgpt.dhexx.cn/article/mh20yVnX.shtml

相关文章

疫情模拟中的SIR模型与扩展的SIRD模型

一.SIR模型 SIR模型起源于流行病学的研究&#xff0c;是模拟传染病动力学的经典模型。至今仍在流行病学中占据中心位置&#xff0c;核心在于微分方程。 SIR模型描述了流行病下三大人群&#xff1a;易感者 susceptible、感染者 infectious、痊愈者 recovered之间的关系。 SIR模…

基于SIR模型的疫情预测 matlab

基于SIR模型的疫情预测 庚子年 庚辰月 丁丑日&#xff0c;疫情从爆发到今天&#xff0c;已经有100多万人感染&#xff0c;而我国有一群这样的逆行者他们以自己的生命筑起了我国的防疫长城&#xff0c;鲁迅先生曾说“我们从古以来&#xff0c;就有埋头苦干的人&#xff0c;有拼…

python实现SI、SIS、SIR、SIRS、SEIR、SEIRS模型

传染病传播模型 SISISSIRSIRSSEIR&#xff08;相比较贴合新冠状病毒&#xff09;SEIRS 在家闲着无事&#xff0c;搜了一些关于传染病模型的知识&#xff0c;在此做个总结。 SI 最简单的SI模型首先把人群分为2种&#xff0c;一种是易感者(Susceptibles)&#xff0c;易感者是健康…

流行病模型(SIR Model)

流行病模型(SIR Model) by : ZhuoFei, Zhou 首先定义一个函数bernoulli(p) #以概率p判断是否会被感染或恢复 function bernoulli(p::Number)if rand(1)[1] < preturn trueelsereturn falseend endbernoulli (generic function with 1 method)恢复所需的时间函数recovery_…

SIR模型与R模拟

SIR病毒模型R模拟 文章目录 SIR病毒模型R模拟[toc]1.SIR病毒模型2.R模拟 1.SIR病毒模型 SIR病毒模型的的三个字母分别为病毒传播过程中的三种状态&#xff0c;其中 S&#xff0c;表示易感染者&#xff0c;即没有被感染病毒的人群I&#xff0c;表示已感染者&#xff0c;即被感…

【python】SIR模型实现

SIR模型python实现 SIR模型是传染病模型中最经典的模型&#xff0c;其中S表示易感者&#xff0c;I表示感染者&#xff0c;R表示恢复者。SIR模型中&#xff0c;染病人群为传染的源头,他通过一定的几率把传染病传给易感人群,他自己也有一定的几率/可以被治愈并免疫,或者死亡;易感…

传染病模型(3)——SIR模型及matlab运行结果

前言 常见的传染病模型按照具体的传染病的特点可分为 SI、SIS、SIR、SIRS、SEIR 模型。其中“S”“E”“I”“R”的现实含义如下&#xff1a; S (Susceptible)&#xff0c;易感者&#xff0c;指缺乏免疫能力健康人&#xff0c;与感染者接触后容易受到感染&#xff1b; E (Exp…

关于SIR模型性质的进一步摘录

1 SIR模型的性质 又是成为SIR搬运工的一天。以下内容来自陈卫老师在《大数据网络传播模型和算法》。纯纯自我记录&#xff0c;不够美观不够细致&#xff0c;不喜欢看出门左拐。 1.1 SIR模型中的basic reproduction rate&#xff08;基础再生数&#xff09; R 0 R_0 R0​ 它是…

SIR模型II

SIR II (Epidemic modeling) by Zhuofei(fregoticloud.com) jupyter notebook link 在这个模型中&#xff0c;考虑一个在一定空间内的流行病模型。人只能与附近的人交互作用&#xff0c;所以给人在一定的空间里随机运动。 首先&#xff0c;在一个2维平面&#xff0c;随机游走&…

SIR信息传播模型

SIR信息传播模型 SIR模型及python复现SIR模型SIR数学模型传播动力学方程python实现 模拟社交网络中SIR模型的信息传播过程 SIR模型及python复现 SIR模型 SIR模型是传染病模型中的经典模型&#xff0c;可以用在传染病过程中的模拟预测&#xff0c;也可以用作抽象表达社交网络中…

SIR模型 matlab模拟

需要一个单独的m文件&#xff1a; %即写上三个微分方程 function ySIRModel(t,x,lambda,mu) y[-lambda*x(1)*x(2),lambda*x(1)*x(2)-mu*x(2),mu*x(2)]; 再进行作图 >> ts0:1:100; >> lambda0.00001; >> mu1/14; >> x0[45400,2100,2500]; >> […

SIR及SEIR建模的简单示例

目录 概述1.一些定义1.1 一些名词1.2 一些符号1.3 一些定义 2.方法论2.1 SIR2.2 SEIR2.3 代际传播2.3.1 传播矩阵 3 模型实现3.1 参数设定3.2 SIR&#xff08;1&#xff09;模型&#xff08;2&#xff09;参数&#xff08;3&#xff09;计算&#xff08;4&#xff09;绘图 3.3 …

SIR模型python实现

python新手&#xff0c;代码不规范之处敬请见谅&#xff0c;第一次发帖排版也不太懂&#xff0c;各位将就看。 参考&#xff1a; SIR模型和Python实现_阿丢是丢心心的博客-CSDN博客_sir模型 【保姆级教程】使用python实现SIR模型&#xff08;包含数据集的制作与导入及最终结…

SI,SIS,SIR,SEIRD模型

SI&#xff0c;SIS&#xff0c;SIR&#xff0c;SEIRD模型 因为个人工作需要系统地整理SI&#xff0c;SIR以及SEIR模型&#xff0c;故对三个模型进行原理介绍以及对比。文中关于SI&#xff0c;SIS&#xff0c;SIR的所有的截图都来自西工大肖华勇老师在慕课上的分享&#xff0c;…

【数学建模】传染病SIR模型

SIR模型 经典的SIR模型是一种发明于上个世纪早期的经典传染病模型&#xff0c;此模型能够较为粗略地展示出一种传染病的发病到结束的过程&#xff0c;其核心在于微分方程&#xff0c;其中三个主要量S是易感人群&#xff0c;I是感染人群&#xff0c;R是恢复人群 这三个量都是跟…

SIR模型简单了解(Susceptible Infected Recovered Model)

SIR模型定义 SIR模型是一种传播模型&#xff0c;是信息传播过程的抽象描述。 SIR模型是传染病模型中最经典的模型&#xff0c;其中S表示易感者&#xff0c;I表示感染者&#xff0c;R表示移除者。 S&#xff1a;Susceptible&#xff0c;易感者 I&#xff1a;Infective&#xf…

【保姆级教程】使用python实现SIR模型(包含数据集的制作与导入及最终结果的可视化)

目录 一、SIR模型介绍 二、Python实现SIR模型 1.制作自己的数据集的两种方法&#xff08;csv格式&#xff09; &#xff08;1&#xff09;excel转为csv格式 &#xff08;2&#xff09;通过python对csv格式文件进行内容修改 2.导入数据集 &#xff08;1&#xff09;具体代码如下…

SIR模型和Python实现

一、SIR模型介绍 SIR模型时传染病中最基础最核心的模型&#xff0c;研究的是某个封闭地区的疫情传播规律。 SIR模型的动力学关系如下图&#xff1a; 健康人数S的变化与 健康人数S和正感人数I的乘积&#xff08;代表健康人数和正感人数的接触&#xff09;成正比&#xff0c;其…

SIR传染病模型(微分方程系列1)

一&#xff1a;基本参数 SIR模型是常见的一种描述传染病传播的数学模型&#xff0c;其基本假设是将人群分为以下三类&#xff1a; S:(Susceptible):易感人群&#xff0c;指未得病者&#xff0c;但缺乏免疫能力&#xff0c;与感病者接触后容易受到感染。 I:(Infective):患病人…

【整站下载器】小飞兔整站下载V5.0

小飞兔整站下载是一款只需输入一个网址就能下载一个网站的软件&#xff0c;它可以从Internet的任何地方抓回你想要的任何文件&#xff0c;整站下载主要是用来快速搭建网站、深层分析网站、网站克隆等。