SIR模型python实现

article/2025/9/26 10:30:58

python新手,代码不规范之处敬请见谅,第一次发帖排版也不太懂,各位将就看。

参考:

SIR模型和Python实现_阿丢是丢心心的博客-CSDN博客_sir模型

【保姆级教程】使用python实现SIR模型(包含数据集的制作与导入及最终结果的可视化)_自然卷的悲伤的博客-CSDN博客_sir模型python

这篇文章增加了平均次数,并且传播过程与参考文章有所不同,代码注释大家看参考文章的就行,SIR模型在上述参考文章中已经介绍很清楚了,咱就不赘述,直接上代码:

1.用到的包

import random
import networkx as nx
import re
import os
import matplotlib.pyplot as plt
import pandas as pd
import time

2. 将连边文件输入,建立Graph(最好是csv文件)

def readEdgeslistToGraph(edges_filename):edge = []with open(edges_filename, 'r', encoding='utf-8-sig') as f:data = f.readlines()for line in data:line_str = line.replace('\r','').replace('\n','').replace('\t','')line = re.split(',| ',line_str)single_edge = tuple([line[0],line[1]])edge.append(single_edge)G = nx.Graph()G.add_edges_from(edge)return G

 注意:是连边文件,或者说边集,比如

3. 初始化网络并随机选择初始“I”态节点

def randomChoiseInfectedNodes(G, initial_infected_nodes_num):infected_nodes = random.sample(list(G.nodes), k=initial_infected_nodes_num)for node in G.nodes():G.nodes[node]["state"] = "S"for node in infected_nodes:G.nodes[node]["state"] = "I"

4.更新节点状态

##更新单个节点状态
def updateNodeState(G, node, infected_rate, recover_rate, old_G):if old_G.nodes[node]["state"] == "I":p = random.random()if p < recover_rate:G.nodes[node]["state"] = "R"elif old_G.nodes[node]["state"] == "S":k = 0for neibor in old_G.adj[node]:if old_G.nodes[neibor]["state"] == "I":k += 1p = random.random()if p < (1 - (1 - infected_rate)**k):G.nodes[node]["state"] = "I"##更新整个网络节点状态      
def updateNetworkState(G, infected_rate, recover_rate):old_G = G.copy()for node in G:updateNodeState(G, node, infected_rate, recover_rate, old_G)

注意: 这里与参考文章不一致,参考文章中没有记录传播前的状态,假如某个节点从“I”态转为“R”态,那么这个节点的“S”态邻居转为“I”态的概率就会偏小(参考文章算这个概率的时候,此时已经把这个节点当成“R”态而非“I”态),因此这里引入old_G来记录每次传播前的状态。

5.计算各个态的节点数

def countSIRnum(G):S = 0I = 0for node in G:if G.nodes[node]["state"] == "S":S += 1if G.nodes[node]["state"] == "I":I += 1 R = len(G.nodes) - S - Ireturn S, I, R def eachIterateSIRnum(days):eachiterate_SIR_list = []for day in range(1, days+1):updateNetworkState(G, infected_rate, recover_rate)tuple_sir = countSIRnum(G)print("day%s:\tS:%s\tI:%s\tR:%s"%(day,tuple_sir[0],tuple_sir[1],tuple_sir[2]))eachiterate_SIR_list.append(list(tuple_sir))return eachiterate_SIR_list

6.画图

def plotSIR(SIR_num_list):color_dict = {"S": "blue", "I": "red", "R": "green"}    df = pd.DataFrame(SIR_num_list,columns=["S","I","R"]) df.plot(figsize=(9,6),color=[color_dict.get(x) for x in df.columns])plt.ylabel("number")plt.xlabel("day")plt.show()

7.完整代码

import random
import networkx as nx
import re
import os
import matplotlib.pyplot as plt
import pandas as pd
import timedef readEdgeslistToGraph(edges_filename):edge = []with open(edges_filename, 'r', encoding='utf-8-sig') as f:data = f.readlines()for line in data:line_str = line.replace('\r','').replace('\n','').replace('\t','')line = re.split(',| ',line_str)single_edge = tuple([line[0],line[1]])edge.append(single_edge)G = nx.Graph()G.add_edges_from(edge)return Gdef randomChoiseInfectedNodes(G, initial_infected_nodes_num):infected_nodes = random.sample(list(G.nodes), k=initial_infected_nodes_num)for node in G.nodes():G.nodes[node]["state"] = "S"for node in infected_nodes:G.nodes[node]["state"] = "I"def updateNodeState(G, node, infected_rate, recover_rate, old_G):if old_G.nodes[node]["state"] == "I":p = random.random()if p < recover_rate:G.nodes[node]["state"] = "R"elif old_G.nodes[node]["state"] == "S":k = 0for neibor in old_G.adj[node]:if old_G.nodes[neibor]["state"] == "I":k += 1p = random.random()if p < (1 - (1 - infected_rate)**k):G.nodes[node]["state"] = "I"def updateNetworkState(G, infected_rate, recover_rate):old_G = G.copy()for node in G:updateNodeState(G, node, infected_rate, recover_rate, old_G)def countSIRnum(G):S = 0I = 0for node in G:if G.nodes[node]["state"] == "S":S += 1if G.nodes[node]["state"] == "I":I += 1 R = len(G.nodes) - S - Ireturn S, I, Rdef eachIterateSIRnum(days):eachiterate_SIR_list = []for day in range(1, days+1):updateNetworkState(G, infected_rate, recover_rate)tuple_sir = countSIRnum(G)# print("day%s:\tS:%s\tI:%s\tR:%s"%(day,tuple_sir[0],tuple_sir[1],tuple_sir[2]))eachiterate_SIR_list.append(list(tuple_sir))return eachiterate_SIR_listdef plotSIR(SIR_num_list):color_dict = {"S": "blue", "I": "red", "R": "green"}    df = pd.DataFrame(SIR_num_list,columns=["S","I","R"]) df.plot(figsize=(9,6),color=[color_dict.get(x) for x in df.columns])plt.ylabel("number")plt.xlabel("day")plt.show()if __name__ =='__main__':start = time.time()edges_filename = 'l_1.txt'initial_infected_nodes_num = 10infected_rate = 0.1recover_rate = 0.02days = 100iterate_num = 100average_SIR_list = [[0,0,0] for i in range(days)]for i in range(iterate_num):G = readEdgeslistToGraph(edges_filename)randomChoiseInfectedNodes(G, initial_infected_nodes_num)eachiterate_SIR_list = eachIterateSIRnum(days)for day in range(days):for state in range(3):average_SIR_list[day][state] +=  eachiterate_SIR_list[day][state] for day in range(days):for state in range(3):average_SIR_list[day][state] =  average_SIR_list[day][state]/iterate_numplotSIR(average_SIR_list)end = time.time()print("running time: %.5s s"%(end - start))

 8.运行结果

 9.数据集

https://wwxd.lanzoue.com/iBdSw0i5uo6j

密码:h6s4


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

相关文章

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

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

官网链接&#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-…