前几日做的是关于第二天新增确诊病例的预测,但是发现那个实在是太简单了,因为疑似病例中最后被确诊成肺炎的比例基本是不变的,在excel上把数据点画上去,然后画一条最优拟合线就完事了。
昨天突然意识到,自己其实有能力做一个关于疫情整体情况的模型,所以今天就动手操作一下。
模型
这次模型中有五类人:
- suseptible(可感人群)
- infectious(可以感染他人,但是由于种种原因没有被隔离,比如处于潜伏期,或者病情较轻,没有放在心上等。没有任何官方的数据来表明这类人的数量)
- diagnosed(被确诊而且被隔离,无法传染其他人。官方对于这类人的数量有明确的数据)
- recover(病情好转出院,获得免疫能力,无法被再次感染)
- death(由于病重,不幸死亡)
有四个变化率:
- 每天被感染的人数
- 每天被隔离治疗的人数
- 每天病情好转出院的人数
- 每天死亡人数
接下来,我们可以写出他们变化率的表达式:
这一次我们只关注
和
这两个量,不去计算疫情结束时的死亡和康复人数(如果想知道这两个量的话,看看死亡率和康复率的相对大小就知道了 ------ 人最后要么康复,要么死亡。按照现在的数据,如果不及时开发出新的治疗方法的话,后果真的很严重)
参数
好,接下来我们来看看如何确定这四个参数。
最好估计的就是
(康复率)和
(死亡率)。根据丁香园的数据,
对于
和
,我们可以做以下推导:
这里我们可以得到的量只有
,
和
。也就是说,对于相同的
,
和
可以有不同的解。不同的参数对应的模型肯定不一样,但是好在不是所有的模型都是最好的,我们可以想办法通过先找到最符合现实的模型,反过来求出这些参数值,然后使用通过这种方法求出的参数来进行预测。
思路:
三个参数
和起始的
必须先确定其中的两个,才能求第三个值。那么先确定哪个呢?
是最难估计的了,那么我们就先确定初始的感染人数吧。新型冠状病毒的潜伏期的平均值有的专家说是10天,有的说是7天,我们选择保守一点的估计,7天。也就是说:
第二个参数我们选择
。
的取值范围应该在0-1之间,如果
大于1,那么就是说同一批人在感染了另一批人之后的同一天住进了医院,这明显不符合事实,那么我们就可以用暴力的方法,将0-1的值遍历一遍,每一遍都求一个最优的
,看看当
取哪个值的时候这三个参数是最优的
公式推导:
关于
的导数:
设置损失函数并对
求导:
更新公式:
其中theta是学习率(learning rate)
代码实现:
模拟每天的变化:
先更新 I,再用更新过的 I 计算D,这样更符合公式的推导
计算损失:
更新
数据:
在建模的过程中最令我绝望的就是数据了,搜遍了全网也也没有发现任何一家媒体把疫情的历史数据整理公开,虽然丁香园提供了历史数据图,但是并没有把所有的数据公开......
只有国家卫生健康委员会和央视新闻从1月19号开始每天播报确诊人数(可以从丁香园的实时播报查到:https://3g.dxy.cn/newh5/view/pneumonia_timeline?whichFrom=dxy)。也就是说,1月19号之前的数据要么根本就没有,要么就不可信......疫情可是从去年12月就开始了呀。
不管了,姑且先用这些数据吧
测试
初始化:
第一天(1月19号)的
(确诊人数)是291,假设潜伏期为7天,那么
就是2037。
和
的取值先随便取,后面还要遍历搜索
遍历搜索:
看来当初始
,
,且
的时候,模型输出和真实数据拟合的是最好的。接下来把最好的
也求出来吧。(在运行代码之前还要再初始化一遍)
我们知道,当
大于0的时候,确诊人数会成指数上涨,现在看来情况依然不是很好啊
把最后拟合出来的图画出来康康:
嗯,看起来拟合的不错,模型的可信度还是有一些的
由于这世界上还没有没有任何关于
的数据,让我们用建好的模型来估计一下
的大小和历史变化吧
注意:这个结果是基于:模型结构没有问题,数学推导没有问题,数据没有问题,各种假设没有问题,初始人数没有问题等等才得到的。因此这张图仅供参考,本人无意制造恐慌。
根据模型输出的结果,截止到1月26号,已经有5万多人被感染了,只是这5万多人由于各种各样的原因没有被检测出来。大家要注意保护好自己呀,那些被确诊的人可能仅仅只是所有被感染人群的冰山一角
至于什么时候情况会好转呢?现在从模型输出的数据上来看还没有好转的迹象,但是从丁香园的数据来看,疑似人数的增长已经放缓了
而且钟老已经放出话了:
也许明天就是转折点呢!