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

SIR模型python实现相关推荐

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

    本文通过Python语言实现SIR模型,并进行可视化,所用例子为足球俱乐部数据集. @author:xiao黄 缓慢而坚定的生长 我之前还写过SI和IC模型的Python实现及可视化,请点击传送门查看 ...

  2. python拟合sir模型_SI,SIS,SIR模型的正确实现(python)

    我已经创建了上述模型的一些非常基本的实现.但是,尽管图表看起来看起来很正确,但这些数字并不等于常数.这是因为每个隔室中易感染/感染/恢复的人的总和应该总计为N(这是人的总数),但是由于某些原因,它加起 ...

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

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

  4. 生物计算:SIR模型笔记

    1SIR模型 susceptible(易受感染的但没有被感染的) infected(感染的) recovered(恢复并免疫了的) 1.1  状态定义 第t天: 状态为S的人数 x(t) 状态为I的人 ...

  5. 程序员角度下使用 SIR 模型预测 nCoV

    " 首先我先介绍一下背景,这篇文章完全是出于个人兴趣以及知识科普而言,并不代表真实性和权威性.使用模型预测流行传染病的疫情发展趋势,是数学建模中常见的手段. 其实在过年的时候就一直在想,之前 ...

  6. P6056 [加油武汉]SIR 模型 看似高深实则很水的题

    题目Link:https://www.luogu.com.cn/problem/P6056 作为一道洛谷月赛的题, 太水了 你乍一看,还以为这道题很高级,又是β又是γ又是向上确取整,还有什么SIR模型 ...

  7. vecm模型怎么写系数_经典传染病的SIR模型(基于MATLAB)

    经典的SIR模型是一种发明于上个世纪早期的经典传染病模型,此模型能够较为粗略地展示出一种传染病的发病到结束的过程,其核心在于微分方程,本次我们利用matlab来对此方程进行 其中三个主要量 S是易感人 ...

  8. 数学建模——TOPSIS综合评价模型Python代码

    数学建模--TOPSIS综合评价模型Python代码 正常代码 import numpy as np # 导入numpy包并将其命名为np ##定义正向化的函数 def positivization( ...

  9. 参数匹配模型——Python学习之参数(二)

    参数匹配模型--Python学习之参数(二) 文章目录 参数匹配模型--Python学习之参数(二) 位置参数:从左至右进行匹配 关键字参数:通过参数名进行匹配 默认参数:为没有传入值的参数定义参数值 ...

最新文章

  1. 最大子矩阵(降维处理)
  2. 高效5步走,高速搭建Hadoop2伪分布环境
  3. CSS内容溢出时,显示省略号
  4. 码农与程序员的惊人差别
  5. 八城联动 丨 神策 2020 数据驱动用户大会「长沙站」重磅来袭!
  6. php thread linux,Linux_linux内核函数kernel_thread,设备驱动程序中,如果需要几 - phpStudy...
  7. 7.1 elementui的radio无法选中问题
  8. 线性代数第3章思维导图
  9. 使用终端命令来关闭Mac电脑
  10. 用spss进行数据的标准化处理_如何用SPSS对数据进行标准化处理
  11. C语言怎么算n维向量的加法,3D数学读书笔记——向量运算及在c++上的实现
  12. Linux 内核引导选项简介
  13. 分享一个微信公众号id转换为biz的接口
  14. 树莓派Web登录校园网WIFI热点DJTU
  15. 其实,我几乎很少看书!
  16. python教科书能在ios系统操作吗_[初学python]苹果何时开放IOS降级通道啊?
  17. 计算机网络课程实验报告一
  18. is invalid, transitive dependencies (if any) will not be available解决方案
  19. java实现图片反色
  20. 怎么在RHEL7上禁用transparent hugepages (THP)

热门文章

  1. ModuleNotFoundError: No module named ‘keras_applications.resnet_v2‘解决方式
  2. 【语音去噪】基于matlab低通滤波器语音去噪【含Matlab源码 1900期】
  3. linux中打开gif图片命令,Terminalizer – 记录Linux终端活动并生成GIF动画
  4. onegreen的绿软word2003绿色版删除不掉的解决方案
  5. 佰马加入智慧灯杆产业联盟
  6. java备忘录模式 类图,【java设计模式】备忘录模式
  7. js 中的可枚举属性
  8. 一款基于SpringBoot2.x, springcloud G版本的后台管理系统java源码—RuoYi-plus管理平台系统模板(商城、OA、CRM等二次开发)
  9. Android 地理位置定位
  10. Linux / Windows Subsystem for Linux (WSL) 安装 ADB (Android Debug Bridge,Android 调试桥)