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的web框架中编写创建日志的程序的教程
Apr 30 Python
在Django的上下文中设置变量的方法
Jul 20 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
python实现布隆过滤器及原理解析
Dec 08 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
利用Python脚本实现自动刷网课
Feb 03 Python
Python流程控制常用工具详解
Feb 24 Python
Python yield的用法实例分析
Mar 06 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 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
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
ThinkPHP里用U方法调用js文件实例
2015/06/18 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
django正续或者倒序查库实例
2020/05/19 Python
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
求职信的要素有哪些呢
2013/12/26 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
python 常用的异步框架汇总整理
2021/06/18 Python
python unittest单元测试的步骤分析
2021/08/02 Python
python读取mnist数据集方法案例详解
2021/09/04 Python
Python中super().__init__()测试以及理解
2021/12/06 Python
mysql 获取时间方式
2022/03/20 MySQL
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
Apache Hudi 加速传统的批处理模式
2022/04/24 Servers