为了账号安全,请及时绑定邮箱和手机立即绑定

AI预测:冠状病毒什么时候可以得到抑制(我们可以从非典SARS学到什么??)

2020.02.07 15:40 5250浏览

2月13日,湖北省对患者数量统计方式做了大调整,临床疑似病例也作为确诊患者上报,当日湖北新增患者数14840例,本文章模型暂未考虑该因素

最近冠状病毒肆虐,国家调动一切资源抑制疫情。突然想建立一个模型,对确诊人数进行预测。

试想,如果你能够提前预判患者增速什么时候下降,是不是可以帮助自己做一些决策?什么时候返回工作岗位、是否适合进行金融投资增加仓位或减仓降低风险?😀

So~~ let’s start!

​实现预测,首先要思考,应该建立一个怎么样的模型?人数预测,属于回归问题,我们可以考虑线性回归、多项式回归、逻辑回归、mlp等等。

There is a big problem~~历史数据很少》》很难确定合适的模型结构

针对训练数据少的情况,一个有效的解决办法就是,建立迁移模型!透过历史数据建立一个合适的模型,然后针对新数据进行二次训练。我首先想到了2003年的SARS。

1、寻找SARS数据:baidu、google、历史文献等等。

找到了这张图:图片描述
接着上wiki确认一下(https://en.wikipedia.org/wiki/Severe_acute_respiratory_syndrome)eventual 8,098 cases。再对比其他数据源,发现这个图的数据是比较靠谱的(可能会有一些出入,但不会太大)。

需要把图片中的患者数量提取出来,how???
给大家推荐一款软件:getdata graph digitizer,加载图片并提取数据后是这样的:
图片描述
数据提取到本地保存为csv
day 2 3 5 7 8 10 12 13 14 17 20 22 24 27 30 33 35 36 39
num 149 209 299 390 509 629 927 1315 1554 1853 2241 2510 2720 2900 3139 3378 3617 3826 4155
day 40 42 43 44 46 47 48 51 53 55 57 59 62 64 66 71 72 75 78
num 4364 4722 4991 5349 5707 5976 6274 6454 6812 7051 7260 7470 7709 7888 7979 8249 8368 8399 8460
day 81 83 87 89 91 93 96
num 8490 8491 8492 8493 8494 8554 8525

观察数据,发现人数趋势与sigmoid函数趋势比较接近,考虑建立mlp模型,采用relu+sigmoid+linear的层级结构。结构代码:
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=50, input_dim = 1, activation=‘relu’))
model.add(Dense(units=50,activation=‘relu’))
model.add(Dense(units=1, activation = ‘sigmoid’))
model.add(Dense(units=1, activation = ‘linear’))
model.compile(optimizer=‘adam’,loss=‘mean_squared_error’)
model.summary()

图片描述

keep in mind: 没有最好的结构,核心在于数据、思路、尝试!

考虑到目前2月6号为止,冠状病毒患者数量接近30000,远高于SARS患者数量,而sigmoid函数有极大值,如果对sars数据直接归一化处理,最终预测结果最大值<9000,无法实现对冠状病毒患者数据的准确预测,计划把所有数据除以100000,加快模型迭代收敛。
y_sars_norm = y_sars/100000

model.fit(X_sars,y_sars_norm,epochs=1000)
y_sars_predict = model.predict(X_sars)
y_sars_predict = y_sars_predict*100000
fig1 = plt.figure(figsize=(7,5))
plt.scatter(X_sars,y_sars,label=‘实际人数’)
plt.plot(X_sars,y_sars_predict,label=‘预测结果’)
plt.title(‘SARS患者数量 VS 天数’)
plt.xlabel(‘第几天’)
plt.ylabel(‘确诊患者总数’)
plt.legend()
plt.show()
图片描述
看书去拟合效果还不错~勉强满意

加载冠状病毒患者数据,对模型二次训练(记得进行数据预处理)
model.fit(X_new,y_new_norm,epochs=1000)
图片描述

预测1-100日的患者数量,生成一个1-100的list,输入给模型,结果如下:
图片描述

图片描述

9、数据更新

2月11日回顾对比了一下最近几日(7-10日)的情况,发现实际增长人数相比预测较高,但新增人数峰值基本与预测一致(2月2日左右)。考虑一个重要的原因可能还是如大家建议的,应该考虑到疑似病例的转换。
图片描述
于是加入最近四天的数据,对模型进行了更新(但因为是基于SARS的迁移学习,还是没有考虑疑似病例的影响)
图片描述

What we can learn from the result??

  1. 新增人数增加峰值预测在2月2日出现,当日新增人数4200人。实际:2月4日,当日新增人数3886人(截至2月7日);
  2. 最终患者数量预计在41200,达到总数的95%的日期在2月15日

2月11日更新:新增人数峰值基本与原来预测一致,患者总数因模型本身考虑因素不够全面导致预测偏低,建议将疑似病例因素加入。模型更新后,预测的病例数95%时间与原来基本一致,依旧保持在15日左右。

建议:

出行时间安排在2月中旬以后,如果疫情确实得到控制,那出行更为安全;
如果2月2日之前金融市场过于恐慌导致大量资产抛售,或许是加仓的机会

风险:

春运是一个很大的意外因素,春节后的返工期,人流巨大,如果控制不好,可能导致疫情的第二波爆发,因此要重点关注返工期后的一周的人数变化
模型预测数据仅供参考,欢迎有兴趣的小伙伴共同探讨。

finally:flare老师的实战课程“零基础入门人工智能:系统学习+实战”课程已经上线,欢迎小伙伴们订阅,和flare老师一起学习AI,掌握AI工具,解决实际问题。

备注:2月13日,湖北省对患者数量统计方式做了大调整,临床疑似病例也作为确诊患者上报,当日湖北新增患者数14840例,,本文章模型暂未考虑该因素

点击查看更多内容

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

28人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消