python模拟预测一下新型冠状病毒肺炎的数据


Posted in Python onFebruary 01, 2020

大家还好吗?

背景就不用多说了吧?本来我是初四上班的,现在延长到2月10日了。这是我工作以来时间最长的一个假期了。可惜哪也去不了。待在家里,没啥事,就用python模拟预测一下新冠病毒肺炎的数据吧。要声明的是本文纯属个人自娱自乐,不代表真实情况。

采用SIR模型,S代表易感者,I表示感染者,R表示恢复者。染病人群为传染源,通过一定几率把传染病传给易感人群,ta自己也有一定的几率被治愈并免疫,或死亡。易感人群一旦感染即成为新的传染源。

模型假设:

①不考虑人口出生、死亡、流动等情况,即人口数量保持常数。

②一个病人一旦与易感者接触就必然具有一定的传染力。假设 t 时刻单位时间内,一个病人能传染的易感者数目与此环境内易感者总数s(t)成正比,比例系数为β,从而在t时刻单位时间内被所有病人传染的人数为βs(t)i(t)。

③ t 时刻,单位时间内从染病者中移出的人数与病人数量成正比,比例系数为γ,单位时间内移出者的数量为γi(t)。
模型为

python模拟预测一下新型冠状病毒肺炎的数据

其中,β为感染系数,代表易感人群与传染源接触被感染的概率。γ为隔离(恢复)系数,我们对其倒数1/γ更感兴趣,代表了平均感染时间(average infectious period)。S(0)为初始易感人数,I(0)为初始感染人数。

按照[1]里面的代码模型的感染人数是这样的

python模拟预测一下新型冠状病毒肺炎的数据

现在的问题就是利用现有的数据找到新冠肺炎的β值,γ值等数据了。先把数据拔下来吧。从[3]上扒数据,由于数据不多,就手工完成吧。保存到csv文件里。

然后把数据作图

python模拟预测一下新型冠状病毒肺炎的数据

还有一个指标是再生数R0=β/γ,大于1时人群中大部分才被感染[4]。世卫组织1月23日的估计是R0在1.4到2.5之间[5],最新的根据前425例发病数据的估计值为2.2[6]。

文章[7]中的按一般病毒性肺炎恢复期25天计算得到的γ值为0.04。

关于β值和初始易感人群,[7]的作者采用的方法是先估计一个区间,然后用最小二乘法找到最佳参数,β≈3.57*10^-5。S[0]的范围为5000-30000人。[7]文章里有matlab代码,我用python改写一下,由于对最小二乘法法的实现比较陌生,尝试了半天,最后我决定用最笨的办法——穷举法。就是用两个嵌套循环将范围内所有β值和S0值都试一遍,计算每次尝试结果与实际数据之间差值的平方和,平方和最小的一组β值和S0值用来做预测。代码如下:

γ值设定为0.04,即一般病程25天

用最小二乘法估计β值和初始易感人数

gamma = 0.04
S0 = [i for i in range(20000, 40000, 1000)]
beta = [f for f in np.arange(1e-7, 1e-4, 1e-7)]
# 定义偏差函数
def error(res):
 err = (data["感染者"] - res)**2
 errsum = sum(err)
 return errsum

# 穷举法,找出与实际数据差的平方和最小的S0和beta值
minSum = 1e10
minS0 = 0.0
minBeta = 0.0
bestRes = None

for S in S0:
 for b in beta:
  # 模型的差分方程
  def diff_eqs_2(INP, t):
   Y = np.zeros((3))
   V = INP
   Y[0] = -b * V[0] * V[1]
   Y[1] = b * V[0] * V[1] - gamma * V[1]
   Y[2] = gamma * V[1]
   return Y

  # 数值解模型方程
  INPUT = [S, I0, 0.0]
  RES = spi.odeint(diff_eqs_2, INPUT, t_range)
  errsum = error(RES[:21, 1])
  if errsum < minSum:
   minSum = errsum
   minS0 = S
   minBeta = b
   bestRes = RES
   print("S0=%d beta=%f minErr=%f" % (S, b, errsum))
print("S0 = %d β = %f" % (minS0, minBeta))

结果 S0 = 39000, β = 8e-6

上述程序耗时较长,只在探索时执行,完了就注释掉,用最优参数进行预测。

python模拟预测一下新型冠状病毒肺炎的数据
python模拟预测一下新型冠状病毒肺炎的数据

预测最大感染人数:23769 时间是在1月10日的33天后,也就是2月12日。

本文代码:https://github.com/zwdnet/2019-nCov-SIRmodel

与[7]作者讨论,我的算法是将S0与β作为独立的两个变量用两个循环嵌套分别遍历,他的做法是用每个S0的值代入微分方程算出相应的β值。他的算法应该更好一些,我正在尝试。另外在微信公众号上看到一篇更系统的关于此次疫情的数学模型的文章:https://mp.weixin.qq.com/s/rgaJtA4jioLOCHs_oCauDg

再次声明:本文只是我个人在家无聊的游戏作品,不是正儿八经的预测。我也不是流行病学专业人士。祝疫情早日结束!武汉加油!中国加油!

总结

以上所述是小编给大家介绍的python模拟预测一下新型冠状病毒肺炎的数据,希望对大家有所帮助!

Python 相关文章推荐
python 性能提升的几种方法
Jul 15 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
Python函数参数操作详解
Aug 03 Python
Python对象与引用的介绍
Jan 24 Python
Python搭建Spark分布式集群环境
Jul 05 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
flask框架路由常用定义方式总结
Jul 23 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
解决python彩色螺旋线绘制引发的问题
Nov 23 Python
python+selenium+Chrome options参数的使用
Mar 18 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 Python
Python warning警告出现的原因及忽略方法
Jan 31 #Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 #Python
PyQt5中多线程模块QThread使用方法的实现
Jan 31 #Python
浅谈python之自动化运维(Paramiko)
Jan 31 #Python
为什么黑客都用python(123个黑客必备的Python工具)
Jan 31 #Python
Win10里python3创建虚拟环境的步骤
Jan 31 #Python
python判断链表是否有环的实例代码
Jan 31 #Python
You might like
Syphon 秘笈
2021/03/03 冲泡冲煮
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
PHP使用函数用法详解
2018/09/30 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
python线程中同步锁详解
2018/04/27 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
Bluebella法国官网:英国性感内衣品牌
2019/05/03 全球购物
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
就业推荐表自我鉴定范文
2014/03/21 职场文书
表彰大会主持词
2014/03/26 职场文书
反腐倡廉标语
2014/06/24 职场文书
个人授权委托书范本
2014/09/14 职场文书
农业项目合作意向书
2015/05/08 职场文书
入党转正介绍人意见
2015/06/03 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
Golang 并发下的问题定位及解决方案
2022/03/16 Golang