近日,我们经常可以看到这样的新闻,“清华AI团队预测:12-19日达到峰值,16日前后出现拐点,6万人将被感染!”,“钟南山院士表示:根据我们团队在传统模型基础上加上影响因素,国家强力干预和春节后的回程高峰消除后,预测高峰应该在2月中接近2月底。到了2月15日,数字果然下来了。我们更接近国外权威的预测值。我们有信心,4月底基本控制。”
疫情预测一方面让疫情防控更加有条不紊地施行,另一方面也给公众带来了信心和安慰。
这些预测都离不开传染病数学模型,按照传染病类型分为 SI、SIR、SIRS、SEIR 模型等,它们研究传染病的传播速度、空间范围、传播途径、动力学机理等问题,可以指导对传染病的有效地预防和控制。
那么今天让小编带你利用AI靶场平台简单的实现SEIR传染病模型,学习它们的原理吧。
1 SEIR 模型原理
在一个简单的Susceptible(易感者)-Exposed(潜伏者)-Infected(感染者)-Removed(康复者)(SEIR)模型中,Susceptible(易感者)是指没有感染过此传染病,迄今健康的人群,也就是大部分人群,宅在家的我们都属于这一类人群,Exposed(潜伏者)是正在此传染病潜伏期的人群,Infected(感染者)是已经确诊的人群,Removed(康复者)是移除的人群(包括康复的人和死亡的人)。
箭头上的参数分别是:
β:一个易感者和一个感染者接触,他被传染的概率。
r:感染者接触易感者的人数。
a:潜伏者转化为感染者的概率,它可以估计为已知的平均潜伏期Y的倒数,即a=1/Y
γ:感染者康复的概率,可以由平均的康复期D的倒数决定,即γ=1/D
以上参数均大于0.
一个病毒在一个群体的传播便可以由以下的非线性常微分方程来描述:
S+E+I+R=N四类人群之和是人口的总数N,以上的方程分别表示了S、E、I、R随时间的变化率。
对数学感兴趣的小伙伴可以自行推导上面的公式,从第四个式子倒着向上推导便很快得出。有了以上的方程,我们就可以把时间变化量δt设为1天,即可依次推出四种人群的变化曲线。
为了方便,我们把这个过程利用python语言进行实现。
2 在AI靶场平台上编程实现
进入首页,我们点击实验,并新建一个实验:
进入代码编辑界面,我们便可以在上面编写代码了。
首先导入要用的包,并且为了能够让画图显示标签而进行一个设置:
import numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
接下来定义一个函数SEIR,这个函数通过输入现有的S,E,I,R的各类人数、r,beta,a,gamma,N的值、时间变化量δt的值,来返回一个δt时间后新的S,E,I,R的各类数量:
def SEIR(seir,para,steps): S,E,I,R = seir r,beta,a,gamma,N = para #赋参数 dS = -(r*beta*I*S)/N #表示微分方程 dE = (r*beta*I*S)/N - a*E dI = a*E - gamma*I dR = gamma*I return [S+dS*steps, E+dE*steps, I+dI*steps, R+dR*steps]
之后定义画图函数:
def plot_graph(np_res):#画图函数 plt.figure() plt.plot(np_res[:,0]) plt.plot(np_res[:,1]) plt.plot(np_res[:,2]) plt.plot(np_res[:,3]) plt.title("SEIR") plt.xlabel("日期/天") plt.ylabel("人数/人)") plt.legend(['易感者','潜伏者','感染者','康复者']) plt.show()
下面再写一个循环,计算200天之内每一天的各类人数,返回一个序列:
def calculate(func,seir,para,intervene_N): steps = 1 t = np.arange(0,200,steps) res=[] for itm in t: if intervene_N!=0: if itm>intervene_N: para[0]=4 para[1]=4 seir=func(seir,para,steps) res.append(seir) return np.array(res)
接下来是参数修改区,可以在这里修改各类人数的初始值、各种参数值。
"""参数修改区"""steps = 1seir= [9999, #S 0, #E 1, #I 0] #Rpara = [20, # I每天接触的人 r 0.03, # S和E被感染的概率 beta 0.1, # 潜伏者变为感染者的概率 a 0.1, # 康复/治愈概率 gamma 10000] # 总人数
最后执行计算函数,并将结果画图:
result = calculate(SEIR,seir,para,0)plot_graph(result)
感染者若不加隔离每天出去接触20个人,易感者被感染的概率?为0.03,潜伏者变为感染者的概率a为0.1,可以看到随时间推移,潜伏者(也即疑似病例)会先达到顶峰,之后随着潜伏者发病成为感染者,感染者后达到增长拐点,随着治疗和自身免疫,潜伏者和感染者人数降低,康复者人数增加。
同学们可以自己调整β、r、a、γ这些参数,做对比实验,观察曲线的变化,来观察SEIR四种人群在不同的参数下会有什么变化,比如,戴口罩可以有效降低被感染的概率,即可以调低β;如果坚持不出门、居家隔离,可以将参数r从20调低。亲自动手实验也可以更好地体验到当下居家隔离、带好口罩是多么地重要。
参考:
https://github.com/YiranJing/Coronavirus-Epidemic-2019-nCov
https://github.com/Harrison-Ho/Analysis-of-2019-nCoV-propagation-based-on-Model
AI靶场是一个隐私保护下的数据价值挖掘平台,可视化的AI工作平台便捷于各类机器学习爱好者,还有百万奖金实战竞赛、高校精品课程即将上线,欢迎加入我们。
抗击疫情 我们一直都在