Py学习  »  Python

用Python模拟新冠肺炎的传播

Python程序员 • 4 年前 • 900 次点击  

看了《华盛顿邮报》上的这篇文章(https://www.washingtonpost.com/graphics/2020/world/corona-simulator/)后,我开始想知道如何用Python进行这样的模拟,并且我想扩展这个想法使它更贴合实际。


刚开始,我想到的是单纯地在Python中使用可视化工具matplotlib来编写这个模拟过程。但是对于大量相互交往的人员来说,所需的计算量会急速增加。提高运算速度意味着降低向量和矩阵计算的运算量,这通过NumPy可以极其高效地完成。NumPy使用了C语言编写的后端,速度很快。它还利用硬件加速功能,例如SIMD(单指令,多数据流),这可以在相当少的时钟周期内对数据组执行许多操作。


除此之外,我已经用NumPy完成了很多工作,但是感觉自己仍然有很多东西要学习,所以挑战来了:建立这样的模拟并改进,在这个过程中仅用NumPy进行计算,并使用matplotlib进行可视化。


模拟运行


索引

  • 简单地模拟感染

  • 年龄影响和医疗能力的模拟

    •   “照常活动”的情况

    •   “减少人际交往”的情况

    •   “封城”的情况

    •   “自我隔离”的情况

    •   自我隔离的不同情形


为了所有模拟的可重复性,numpy的种子都设置为100(除非另外说明)。


视屏集锦


可以在此处观看模拟某些重要情况的视频。(http://www.paulvangent.com/covid/Covid_Compilation_reinfection.mp4)


简单地模拟感染


第一步,我模拟了随机移动的人群。人们在世界范围内活动,每一次活动,人们就有2%的几率改变前进的方向和速度。靠近感染者时,有3%的几率被感染而得病,死亡率为2%。点击图片观看视频(http://www.paulvangent.com/covid/Simple_Simulation.mp4)。

有关代码请见simple_simulation.py(https://github.com/paulvangentcom/python_corona_simulation/blob/master/simple_simulation.py)。


如您所见,该病毒设法迅速传播,并且几乎所有人都被感染。最终有44人丧生,预计死亡率为2%。


年龄影响和医疗能力的模拟


实际情况当然更复杂。让我们考虑随着年龄增长而增加的风险,以及医疗系统的有限容量。两者都影响大流行期间的死亡率:老年人很脆弱,一旦医疗保健系统不堪重负,那么人们由于缺乏治疗而死亡的风险会增加。下列参数处于活动状态(所有参数均可设置):

  • 人口的年龄遵循高斯分布,平均数为55,标准差为平均值的1/3,最大值为105

  • 总人口为2000人

  • 当接近感染者时,有3%的几率被感染

  • 死亡率基线为2%

  • 死亡率在55岁时开始增加,在75岁及以上时按指数增长,达到10%

  • 医疗系统容量为300张床位。

  • 就医时:死亡率减半

  • 不医治时:死亡率增加三倍。

请注意,这会严重影响老年人,因为他们的风险基准一开始就比较高了。


“照常活动”的情况


有关代码和可设置的参数,请见simulation.py(https://github.com/paulvangentcom/python_corona_simulation/blob/master/simulation.py)。


第一个模拟展示了一群人,他们只是继续做平常做的事情并四处走动。点击图像查看视频(http://www.paulvangent.com/covid/LimitedHealthcare_FastSpread.mp4)。


从下面的模拟中可以看到,医疗系统完全不堪重负,导致215人死亡(占人口的10.75%)。


“减少人际交往”的情况


第二个模拟具有相同的设置,但是要模拟人们尽可能呆在家里,并且仅在必要时才出门,这样流动性大大降低了。点击图像查看视频(http://www.paulvangent.com/covid/LimitedHealthcare_SlowMobility.mp4)。


正如您在此模拟中看到的,尽管在某些时候医疗能力供不应求,但却使得死亡率变低了,在此模拟中有58个人死亡(2.9%)。死亡人数几乎减少了4倍。


“封城”的情况


让我们模拟5%的人口受到感染时的封城情况。为了这样模拟,一旦封城,我们将使90%的人停止活动,其余10%的人将以较低的速度活动,这样可以模拟他们变得更加谨慎。这10%的人代表了对社会至关重要的职业:这些人即使在封城情况下,也将继续活动并与其他人保持联系。这10%的人中有少部分是感染者,这意味着封城的措施不是完美的,因为总会有一些人违反隔离措施。点击图像查看视频(http://www.paulvangent.com/covid/lockdown_90percent.mp4)。

请注意,封城之后,感染数量仍会增加一段时间。之所以发生这种情况,是因为一些健康的人与感染者待在同一个家庭中,因此很快就会被感染。如果可自由活动的人(可能是邮递员或送食物的人)感染了一群正在隔离的人,那么该疾病会继续传播。封城使得疫情在较小的区域内爆发并被隔离,通过封城可以很好地控制疫情爆发。


但是,如果解除封城并引入新的情况,那么如果不采取适当的措施,则可能迅速导致产生潜在的危险情况:

在这种情况下,如果感染持续复发,那么反复封城似乎是不可避免的。


“自我隔离”的情况


另一种方法是自我隔离:让有症状的人待在家里。这是荷兰政府最初采取的措施,也是许多尚未封城的国家的措施。特别考虑到并非每个人都可以严格遵循该措施,那么这种措施的效果如何呢?事实证明,感染者可以在无症状的情况下传染给其他人,这使得“生病时待在家里”的情况更加复杂了。


在这个模拟中,被感染的人会自我隔离。那些前往隔离区的人无法再感染其他人,以此来模拟这些人已经意识到自己被感染,并采取预防措施以不感染其他人。点击图像查看视频(http://www.paulvangent.com/covid/Self_Isolation.mp4)。



自我隔离的不同情形


这里的情况更加复杂,因为人口密度和破坏隔离的人数比例等因素具有很大的影响。让我们以三种人口密度运行模拟(“高密度”:1x1的区域上有2000人;“中密度”:1.5x1.5的区域上有2000人;“低密度”:2x2的区域上有2000人),让我们模拟这些不同的感染情况。因为情况是随机的,所以我们对每个设置进行包含100次迭代的蒙特卡洛模拟,以便使我们的模拟结果更可信:


高人口密度:

中等人口密度:

低人口密度:

这展示了人口密度(以及每个时间单位会遇到多少人)与感染人群所占百分比之间的相互作用。这就是您所预料的,因为这两个因素都会影响遇到感染者的几率。请注意,这些图显示了一个清晰的“临界点”:感染数达到n之后,病毒的传播开始加速。感染峰值取决于有多少人遵循了自我隔离。但是,有报道称,有些人即使没有症状,但仍然具有传染性,并且在恢复后相当长一段时间内仍具有传染性,这使得这些人的自我隔离对于COVID-19的传播来说还是有风险。


英文原文:https://github.com/paulvangentcom/python_corona_simulation
译者:桃夭

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/61863
 
900 次点击  
文章 [ 1 ]  |  最新文章 3 年前