SIR信息传播模型

article/2025/9/26 9:41:09

SIR信息传播模型

  • SIR模型及python复现
    • SIR模型
    • SIR数学模型
        • 传播动力学方程
        • python实现
    • 模拟社交网络中SIR模型的信息传播过程

SIR模型及python复现

SIR模型

SIR模型是传染病模型中的经典模型,可以用在传染病过程中的模拟预测,也可以用作抽象表达社交网络中的信息传播过程,本文讲述的是后者。
SIR模型将社交网络中的节点分为三类: S S S类,易感染者,指未接收信息且不具备传播能力的节点; I I I类,感染者,指接收信息且具备传播能力的节点; R R R类,免疫者,指接收信息后退出传播过程的节点。
SIR模型的传播机制如下图所示:

其中, β β β代表感染率,即时刻 t t t 时单位时间内 I I I类节点新增的感染个体与 S S S类节点个数成比例,比例系数为 β β β γ γ γ代表免疫率(恢复率),即时刻 t t t 时单位时间内 R R R类节点新增的免疫个体与 R R R类节点个数成比例,比例系数为 γ γ γ

SIR数学模型

传播动力学方程

我们将上述传播模型表达为动力学方程。这里设置节点总数为 N N N,其他三类节点初始数目分别为 S 、 I 、 R S、I、R SIR N = S + I + R N=S+I+R N=S+I+R。则有下列方程
{ d S d t = − β S I N , d I d t = β S I N − γ I , d R d t = γ I \begin{cases} \quad \dfrac{dS}{dt}=-βS\dfrac{I}{N},\\ \quad \dfrac{dI}{dt}=βS\dfrac{I}{N}-γI,\\ \quad \dfrac{dR}{dt}=γI \end{cases} dtdS=βSNI,dtdI=βSNIγI,dtdR=γI
其中, I N \dfrac{I}{N} NI代表 S S S类与 I I I类的接触率。

python实现

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as pltdef sir_model(input_v, t):s, i, r = input_vn = s + i + rds_dt = - beta * s * (i / n)di_dt = beta * s * (i / n) - gamma * idr_dt = gamma * ireturn [ds_dt, di_dt, dr_dt]if __name__ == '__main__':# 模型输入值N = 10000  # 设定总节点数量S0 = 9980  # S类节点数量I0 = 18  # I类节点数量R0 = N - S0 - I0  # R类节点数量input_value = (S0, I0, R0)beta = 0.5  # 设定感染率gamma = 0.1  # 设定免疫率# 设定步长 即传播次数times = np.linspace(0, 60, 60)# 求解微分方程result = odeint(sir_model, input_value, t=times)# 画图plt.plot(result[:, 0], '-ro', label='S')plt.plot(result[:, 1], '-b^', label='I')plt.plot(result[:, 2], '-gs', label='R')plt.legend(loc=0)plt.xlabel('times')plt.ylabel('number')plt.show()

实现结果如下图所示。

模拟社交网络中SIR模型的信息传播过程

在这里由于没有数据集,所以只能用python中的Networkx库,这里我们使用BA无标度网络模型(个人认为比较接近于现实社交网络)。

import networkx as nx
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
# 确保 中文 和 -
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef update_node_status(G, node, beta, gamma):"""更改节点状态:param G: 输入图:param node: 节点序数:param beta: 感染率:param gamma: 免疫率"""# 如果当前节点状态为 感染者(I) 有概率gamma变为 免疫者(R)if G.nodes[node]['status'] == 'I':p = random.random()if p < gamma:G.nodes[node]['status'] = 'R'# 如果当前节点状态为 易感染者(S) 有概率beta变为 感染者(I)if G.nodes[node]['status'] == 'S':for adj_node in G[node]:if G.nodes[adj_node]['status'] == 'I':p = random.random()if p < beta:G.nodes[node]['status'] = 'I'breakdef update_network_data(G, beta, gamma):"""更改图数据:param G: 输入图:param beta: 感染率:param gamma: 免疫率"""for node in G:update_node_status(G, node, beta, gamma)def initial_network_data(G, i_num, r_num):"""初始化图数据:param G: 输入图:param i_num: 感染者数量:param r_num: 免疫者数量"""# 感染节点集i_set = set(random.sample(G.nodes, i_num))# 免疫节点集r_set = set(random.sample(G.nodes, r_num))# 两个集合不能重复while r_set & i_set:r_set = set(random.sample(G.nodes, r_num))# 初始化节点状态for node in G:if node in i_set:G.nodes[node]['status'] = 'I'elif node in r_set:G.nodes[node]['status'] = 'R'else:G.nodes[node]['status'] = 'S'def count_node(G):"""计算当前图内各个节点的数目:param G: 输入图:return: 各个节点数目"""s_num, i_num, r_num = 0, 0, 0for node in G:if G.nodes[node]['status'] == 'S':s_num += 1elif G.nodes[node]['status'] == 'I':i_num += 1else:r_num += 1return s_num, i_num, r_numdef draw_network(G):"""输出初始网络节点分布:param G: 输入图"""# 设置图大小fig, ax = plt.subplots(figsize=(12, 8))ax.set_title("易感染者-感染者-免疫者节点初始分布")pos = nx.spring_layout(G, scale=1)nx.draw(G, pos=pos, with_labels=True, font_color='white', edge_color='grey',node_color=[color_dict[ba.nodes[node]['status']] for node in G])def draw_node_trend(G, beta, gamma):"""输出各类节点趋势:param G: 输入图:param beta: 感染率:param gamma: 免疫率"""# 设定传播步长t_list = np.linspace(1, 24, 24)# 开始模拟传播for t in range(len(t_list)):# 计算并存储当前各个节点数目node_list.append(count_node(G))update_network_data(G, beta, gamma)# 整理数据df = pd.DataFrame(data=node_list, index=t_list, columns=['S', 'I', 'R'])# 显示数据曲线df.plot(figsize=(8, 6), color=[color_dict.get(x) for x in df.columns])plt.ylabel('nodes(节点数)')plt.xlabel('days(天数)')plt.title('易感染者-感染者-免疫者节点趋势')plt.savefig('SIR_model')plt.show()def update_graph(i, G, ax, pos, beta, gamma):"""动态更新节点:param i: 输入帧:param ax: 输入图参数:param G: 输入图:param beta: 感染率:param gamma: 免疫率"""i = int(i)ax.set_title("第" + str(i + 1) + "天 易感染者-感染者-免疫者节点分布")ax.axis('off')plt.box(False)if i == 1:# 第一天  初始节点分布  直接画出nx.draw(G, with_labels=True, font_color='white', edge_color='grey',node_color=[color_dict[ba.nodes[node]['status']] for node in G], pos=pos)else:# 以后变化 需要演变节点update_network_data(G, beta, gamma)nx.draw_networkx_nodes(G, with_labels=True, font_color='white', edge_color='grey',node_color=[color_dict[ba.nodes[node]['status']] for node in G], pos=pos)def draw_network_trend(G, beta, gamma, days):"""输出网络动态变化视频:param G: 输入图:param beta: 感染率:param gamma: 免疫率:param days: 需要的时间(迭代次数)"""fig, ax = plt.subplots(figsize=(12, 8))pos = nx.spring_layout(G, scale=1)ani = animation.FuncAnimation(fig, update_graph, frames=days,fargs=(G, ax, pos, beta, gamma), interval=300)writer = animation.FFMpegWriter()ani.save('network_trend.mp4', writer=writer)if __name__ == '__main__':# 总人数N = 10000# 易感染者人数s = 9980# 感染者人数i = 18# 免疫者人数r = N - s - i# 各个节点数目列表node_list = []# 节点颜色color_dict = {'S': 'blue', 'I': 'red', 'R': 'green'}# 创建BA无标度网络ba = nx.barabasi_albert_graph(N, 3, seed=1)# 初始化网络节点initial_network_data(ba, i, r)# 输出节点趋势图draw_node_trend(ba, 0.4, 0.1)# 初始节点分布图# 输出初始节点网络图# draw_network(ba)# 输出网络动态变化图# draw_network_trend(ba, 0.2, 0.15, 50)

上述代码得到的结果如下图所示。

这里说一下,如果有数据集可以修改一下这个代码,将数据集中的边集和节点集输入Networkx中的空白图中,剩余可以不改变,也可以模拟SIR模型在真实社交网络下的传播过程。
从SIR模型中我们可以看到, β β β γ γ γ在很大程度会影响信息传播过程。如果利用真实数据集,也要注意不同的 β β β γ γ γ值,会有不同的结果。同时,利用好真实数据集,我们可以求出近似真实值 β β β γ γ γ值。
另外在上述主程序代码的最后几行,我增加了生成网络初始分布图和动态实现社交网络中节点变化的函数。动态实现那部分需要一个ffmpeg的软件才可以生成。


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

相关文章

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;整站下载主要是用来快速搭建网站、深层分析网站、网站克隆等。

【小飞兔整站下载】整站下载器哪个好用_整站下载工具哪个好

小飞兔整站下载是一款可以下载整个网站内容的软件&#xff0c;你只要输入一个网址&#xff0c;软件能自动分析网站链接、图片、样式、文件等资源&#xff0c;并能将整个网站下载到本地&#xff0c;能在本地正常跳转、浏览。 官网&#xff1a;https://xft.fzxgj.top/ 直接上图…

快速获取一个网站的所有资源,图片,html,css,js等等

今天介绍一款软件,可以快速获取一个网站的所有资源,图片,html,css,js… 以获取某车官网为例 我来展示一下这个软件的功能. 1、输入网站地址 2、下载文件 到此,爬取网站就结束了,有些网站的资源使用的是国外的js,css,速度会有些差异,但效果都是一样的.爬取下来就能使用.放…

小飞升值记——(5)

目录 一&#xff1a;学习痕迹 二&#xff1a;学习结语 一&#xff1a;学习痕迹 二&#xff1a;学习结语 1.注意断句 2.注意refill的读音&#xff0c;重音在后面

根据url一键爬取前端页面资源文件,恐怖如斯-----小飞兔

前言 有一天你在网上发现一个很好看的前端页面,你想要弄下来在自己的项目上使用,于是你去查看源码,复制html代码和资源文件,过程非常的麻烦,而且很可能缺胳膊少腿,这里我给大家推荐一款可以一键爬取前端页面资源文件的工具给大家,希望对大家有所帮助. 下载 https://download.cs…

小飞兔整站下载如何设置特殊标签?

小飞兔整站下载如何设置特殊标签&#xff1f; 为什么提供自定义标签的功能&#xff1f;如何设置自定义标签&#xff1f; 为什么提供自定义标签的功能&#xff1f; 随着html5网站的快速发展&#xff0c;很多网站做了格式各样的特殊标签&#xff0c;而我们需要匹配特殊标签的资源…

c语言兔子繁殖问题pia,上海虹口幼升小转学报名,在喂养幼兔的时候我们要注意。...

上海虹口幼升小转学报名&#xff0c;在喂养幼兔的时候我们要注意&#xff0c;在喂养幼兔的时候我们要注意&#xff0c;不能直接用自来水为给幼兔喝&#xff0c;因为幼鸡初期的消化食物是很慢的&#xff0c;做好室内清洁卫生并对猫咪进行隔离幼猫在有猫癣的时候&#xff0c;这样…

最新版本 Stable Diffusion 开源 AI 绘画工具之汉化篇

✨ 目录 &#x1f388; 汉化预览&#x1f388; 下载插件方法一&#x1f388; 下载插件方法二&#x1f388; 下载插件方法三&#x1f388; 简单汉化&#x1f388; 双语汉化 &#x1f388; 汉化预览 在上一篇文章中&#xff0c;我们安装好了 Stable Diffusion 开源 AI 绘画工具但…

StyleGAN 调整面部表情,让虚拟人脸更生动

✨ 目录 🎈 人脸表情🎈 调整步骤🎈 调整结果🎈 人脸表情 通过上一篇文章 StyleGAN 生成的人脸:https://tinygeeker.blog.csdn.net/article/details/129667295人脸图片都是比较中规中矩的,如果能够给人脸增加一些表情的话,会让人脸显得更加的自然和逼真那么调整人脸的…

springMVC小bug webapp/.html访问不到

我们要访问 test.html 启动tomcat 404 web服务器中也有一个web。xml 父servlet&#xff1a;是给所有web.xml准备服务静态资源的 但是子类也是 一个/ 这个/会覆盖父xml 父类有jsp不会拦截&#xff0c;子类没有重写所有会访问.jsp 两个解决方法&#xff1a;方法1&#…

运用帝国CMS建站仿站的简单教程(初学者进)

帝国CMS是一款管理网站的软件系统&#xff0c;主要就是将网站生成模板&#xff08;核心操作为创建变量和模板并调用&#xff09;并通过该系统在网站上发布新信息&#xff0c;它具有许多的功能&#xff0c;细节方面也有很多&#xff0c;这里就不一一展示了&#xff0c;主要就是简…