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

article/2025/9/26 12:51:01

目录

一、SIR模型介绍

二、Python实现SIR模型

1.制作自己的数据集的两种方法(csv格式)

(1)excel转为csv格式

(2)通过python对csv格式文件进行内容修改

2.导入数据集

(1)具体代码如下所示:

(2)点数据集与连边数据集展示

(3)变量格式展示

 3.制定初始网络

 (1)具体代码如下

(2)重要变量内容格式展示如下

 4. 定义网络节点状态更新规则

(1)具体更新思想

(2)代码呈现如下

5.模拟执行过程并展示结果图

(2)结果图展示部分代码

(3)部分变量内容展示

(4)结果图展示

 三,通过python制作散点图

1.代码部分

 2.散点图呈现


一、SIR模型介绍

        经典SIR模型是一种传染病模型,此模型能够简单地展现出一种传染病从出现到扩散再到最后逐渐被消灭的过程。该模型假设总节点数保持不变,且每个个体存在于三种可能的人群状态之中,分别为:S,代表易感人群;I,代表感染人群;R,代表恢复人群(假定恢复人群不会再次被感染)。 三类人群状态之间的转换规则如图1所示:

        SIR模型中除了上述三种人群状态外,还设定了两个常值,分别为感染概率a和恢复概率b。每个时间单位,每个状态为易感人群S的节点若和系统网络中的感染人群I中的节点存在连接,则有a的概率受到感染人群I影响,被感染转换状态,成为感染人群I中的节点。而感染人群I中的节点,在每个单位时间下,则有b的概率,转换自身状态,成为恢复人群R中的节点。

        S(t),I(t),R(t)分别代表了当前时间点下,易感人群S总人数,感染人群I总人数及恢复人群R总人数。通过不同人群的占比,我们可以得到当前时刻,感染状态的人群所占总人群的比例,从而了解当前传染病的蔓延程度如何。


二、Python实现SIR模型

1.制作自己的数据集的两种方法(csv格式)

(1)excel转为csv格式

将所需数据按列输入excel中

输入完毕后,另存为csv格式进行保存,格式选择如下

 保存完后的csv格式文件在程序中内容如下所示

 

(2)通过python对csv格式文件进行内容修改

具体内容代码参考下方博客即可,写的很详细

通过python编写csv格式文件的四种类型

2.导入数据集

(1)具体代码如下所示:

import pandas
import csv
import randomnode_df = pandas.read_csv('E:/data/节点.csv')
all_nodes_list = node_df.values.tolist()  #获取文件中所有节点edge = []   #获取所有边
with open('E:/data/边.csv','r',encoding='utf-8-sig') as f: data = f.readlines()  for line in data: line = list(line.replace('\r','').replace('\n','').replace('\t','').split(','))# 去除“,”和换行符,将data列表中的元素转换为列表single_edge = tuple([line[0],line[1]])edge.append(single_edge)

为了更加直观理解每个变量内容,针对如下点与边的csv文件内容展示部分变量:

(2)点数据集与连边数据集展示

(3)变量格式展示

node_df,all_nodes_list,data格式如下

 line每一轮从列表data中获取一个元素,以第一轮为例,刚获取时格式如下:

  通过执行 line = list(line.replace('\r','').replace('\n','').replace('\t','').split(',')) ,将其中的逗号与换行符去除,并转换为列表,此时格式如下:

 通过执行 single_edge = tuple([line[0],line[1]]) ,提取line列表中的元素,并以元组形式储存于single_edge 中,此时格式如下:

 每个轮次将得到的single_edge内容存储于edge中,最终当所有轮次执行完后,edge内容如下:

 3.制定初始网络

 (1)具体代码如下

参数初始化设置

days = 50  # 设置模拟的天数
alpha = 0.2  # 感染率
beta = 0.10  # 恢复率# 设置不同人群的显示颜色,易感者为橘色,感染者为红色,恢复者为绿色
color_dict = {"S": "orange", "I": "red", "R": "green"}

节点状态初始化设置

import networkx as nx
ba = nx.Graph()        # 引入一个类
ba.add_edges_from(edge)  # 将上一步的edge导入这个类中
for node in ba.nodes():  # 将每个人的初始状态设为“S”ba.nodes[node]["state"] = "S"
# 随机选取一个节点为初始感染者,此处设定为老张
ba.nodes["老张"]["state"] = "I"

(2)重要变量内容格式展示如下

仅使用了ba类中的 adj 与 nodes部分,每个人的adj中存储了与其有连接的人(即邻居),nodes中存储了每个人当前状态。

特别注意:类中数据类型为dict(字典)的数据部分设定完成后无法更改。

 4. 定义网络节点状态更新规则

(1)具体更新思想

先考虑单个节点的更新

我们使用一个简单的函数来实现一个节点的状态的更新。

首先,如果一个节点是恢复者,那么下一步还是恢复者,其节点状态保持不变。 如果一个节点是感染者,那么其恢复的概率是 β。用程序实现的方法为,先均匀生成一个0到1的随机数 p,如果 p < β,则节点恢复,否则节点依然处于感染状态。

如一个节点是易感者,先要去其邻居节点中看看一共有多少个邻居是感染者,有 k 个邻居是感染者,那么当前节点被感染的概率是 1 - (1 - α)k。我们生成一个0到1的随机数 p,如果 p < 1 - (1 - α)k,则节点被感染,否则不被感染。

(2)代码呈现如下

对单个节点更新部分的代码

import random# 根据 SIR 模型,更新单一节点的状态
def updateNodeState(G,node, alpha, beta):if G.nodes[node]["state"] == "I": #感染者p = random.random() # 生成一个0到1的随机数if p < beta:   # gamma的概率恢复G.nodes[node]["state"] = "R" #将节点状态设置成“R”elif G.nodes[node]["state"] == "S": #易感者p = random.random() # 生成一个0到1的随机数k = 0  # 计算邻居中的感染者数量for neibor in G.adj[node]: # 查看所有邻居状态,遍历邻居用 G.adj[node]if G.nodes[neibor]["state"] == "I": #如果这个邻居是感染者,则k加1k = k + 1if p < 1 - (1 - alpha)**k:  # 易感者被感染G.nodes[node]["state"] = "I" 

通过遍历循环,实现对所有节点的状态更新:

def updateNetworkState(G, alpha, beta):  # 需要对应的ba,感染率,恢复率for node in G: #遍历图中节点,每一个节点状态进行更新updateNodeState(G,node, alpha, beta)   # 需要对应的ba,当前节点,感染率,恢复率

在每个时间单位下,当遍历更新完所有人当前状态后,用函数countSIR对3类人群的数量进行统计。

# 计算三类人群的数量
def countSIR(G):S = 0;I = 0for node in G:if G.nodes[node]["state"] == "S":S = S + 1elif G.nodes[node]["state"] == "I":I = I + 1return S,I, len(G.nodes) - S - I    

5.模拟执行过程并展示结果图

(1)执行部分代码展示

在图中开始SIR模型的模拟,设置模拟天数,开始执行模拟过程

import time
SIR_list = []
for t in range(0,days):updateNetworkState(ba,alpha,beta) #对网络状态进行模拟更新SIR_list.append(list(countSIR(ba))) #计算更新后三种节点的数量

(2)结果图展示部分代码

模型结果可视化

# 模拟天数为days,更新节点状态
import matplotlib.pyplot as pltdf = pandas.DataFrame(SIR_list,columns=["S","I","R"])
df.plot(figsize=(9,6),color=[color_dict.get("x") for x in df.columns])
plt.show()

(3)部分变量内容展示

将每一天的3类人群数量转换为一个列表,将每一天的列表放入SIR_list 中,最终 SIR_list 内容如下所示 :

通过执行df = pandas.DataFrame(SIR_list,columns=["S","I","R"]),df内容如下所示:

通过执行df.plot(figsize=(9,6),color=[color_dict.get(x) for x in df.columns]) ,将3类人群曲线得到不同颜色。

(4)结果图展示


 三,通过python制作散点图

 在上述用python实现SIR模型的基础上,增添了散点图的呈现方式,更好地呈现了个体与个体之间的联系。

1.代码部分

ps=nx.spring_layout(ba)  #针对上述SIR模型中的ba类,布置框架
nx.draw(ba,ps,with_labels=False,node_size=30)  
# with_labels指是否给每个点设定标签,由于数据集中个体为人的名字,中文无法直接作为标签,故而设定为不需要
plt.show()

 2.散点图呈现

 


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

相关文章

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;主要就是简…

计算机毕业设计制作模仿网站的期末作业通过神器——各种扒站方法(网站,软件)

官网链接&#xff1a;点我进入在线扒站 扒站完尽快下载&#xff0c;详情官网查看。 以下是一些需要下载的扒站工具 名字&#xff1a;teleport ultra 下载&#xff1a;Teleport 官网 名字&#xff1a;仿站小工具 小飞兔 下载&#xff1a;小飞兔官网 名字&#xff1a;Interne…

小飞兔整站下载V16.5-站点克隆工具

简介&#xff1a; 小飞兔网站克隆神器&#xff0c;一键复制克隆网站、小白必备&#xff01; 有了这个东西&#xff0c;看到自己喜欢的网站直接复制下了&#xff0c;再用dw修改内容&#xff0c;省事多了。 网盘下载地址&#xff1a; https://zijieyunpan.cn/AtqSxg3OdJe 图片…

【参赛作品4】初窥openGauss 之参数自调优(X-Tuner)

TPC-H 是一个面向分析型业务(AP)的基准测试&#xff0c;它由一系列热点查询组成&#xff0c;这些热点查询都是高度复杂的&#xff0c;因此执行时间往往都比较长。 在本次实验测试中&#xff0c;将手动向数据库加载TPC-H数据&#xff0c;并保存在名为 tpch 的数据库中。默认TPC-…

亲测好用的油管音乐播放器:Tuner Mac版

Tuner for YouTube music Mac版是一款优质的youtube音乐播放器&#xff0c;Tuner支持快速搜索想要听的音乐&#xff0c;支持创建自定义播放列表、在线播放等功能&#xff0c;另外Tuner for YouTube music mac版还提供了画中画功能&#xff0c;你可以直接观看视频&#xff0c;还…

读论文---Clip微调---CLIP Itself is a Strong Fine-tuner

标题 摘要 Recent studies have shown that CLIP has achieved remarkable success in performing zero-shot inference while its fine-tuning performance is not satisfactory. In this paper, we identify that fine-tuning performance is significantly impacted by hyp…

Tuner工作原理详解

1、TV自动搜台原理:https://wenku.baidu.com/view/3b771f8b84868762caaed514 2、彩电自动搜台的原理与维修:http://tv.baoxiu.com/a/201001/170815.htm 3、TV Tuner搜台基础: https://wenku.baidu.com/view/bd0cefd133d4b14e85246882.html 4、TV+Tuner+Application+on+DVD+t…

Pytorch-Lightning--Tuner

Pytorch-Lightning–Tuner lr_find() 参数详解 参数名称含义默认值modelLightningModule实例train_dataloaders训练数据加载器Noneval_dataloaders验证数据加载器NonedatamoduleLightningDataModule实例Nonemin_lr学习率最小值1e-08max_lr学习率最大值1num_training测试学习…