python模擬預(yù)測一下新型冠狀病毒肺炎的數(shù)據(jù)
大家還好嗎?
背景就不用多說了吧?本來我是初四上班的,現(xiàn)在延長到2月10日了。這是我工作以來時(shí)間最長的一個(gè)假期了。可惜哪也去不了。待在家里,沒啥事,就用python模擬預(yù)測一下新冠病毒肺炎的數(shù)據(jù)吧。要聲明的是本文純屬個(gè)人自娛自樂,不代表真實(shí)情況。
采用SIR模型,S代表易感者,I表示感染者,R表示恢復(fù)者。染病人群為傳染源,通過一定幾率把傳染病傳給易感人群,ta自己也有一定的幾率被治愈并免疫,或死亡。易感人群一旦感染即成為新的傳染源。
模型假設(shè):
①不考慮人口出生、死亡、流動等情況,即人口數(shù)量保持常數(shù)。
②一個(gè)病人一旦與易感者接觸就必然具有一定的傳染力。假設(shè) t 時(shí)刻單位時(shí)間內(nèi),一個(gè)病人能傳染的易感者數(shù)目與此環(huán)境內(nèi)易感者總數(shù)s(t)成正比,比例系數(shù)為β,從而在t時(shí)刻單位時(shí)間內(nèi)被所有病人傳染的人數(shù)為βs(t)i(t)。
③ t 時(shí)刻,單位時(shí)間內(nèi)從染病者中移出的人數(shù)與病人數(shù)量成正比,比例系數(shù)為γ,單位時(shí)間內(nèi)移出者的數(shù)量為γi(t)。
模型為
其中,β為感染系數(shù),代表易感人群與傳染源接觸被感染的概率。γ為隔離(恢復(fù))系數(shù),我們對其倒數(shù)1/γ更感興趣,代表了平均感染時(shí)間(average infectious period)。S(0)為初始易感人數(shù),I(0)為初始感染人數(shù)。
按照[1]里面的代碼模型的感染人數(shù)是這樣的
現(xiàn)在的問題就是利用現(xiàn)有的數(shù)據(jù)找到新冠肺炎的β值,γ值等數(shù)據(jù)了。先把數(shù)據(jù)拔下來吧。從[3]上扒數(shù)據(jù),由于數(shù)據(jù)不多,就手工完成吧。保存到csv文件里。
然后把數(shù)據(jù)作圖
還有一個(gè)指標(biāo)是再生數(shù)R0=β/γ,大于1時(shí)人群中大部分才被感染[4]。世衛(wèi)組織1月23日的估計(jì)是R0在1.4到2.5之間[5],最新的根據(jù)前425例發(fā)病數(shù)據(jù)的估計(jì)值為2.2[6]。
文章[7]中的按一般病毒性肺炎恢復(fù)期25天計(jì)算得到的γ值為0.04。
關(guān)于β值和初始易感人群,[7]的作者采用的方法是先估計(jì)一個(gè)區(qū)間,然后用最小二乘法找到最佳參數(shù),β≈3.57*10^-5。S[0]的范圍為5000-30000人。[7]文章里有matlab代碼,我用python改寫一下,由于對最小二乘法法的實(shí)現(xiàn)比較陌生,嘗試了半天,最后我決定用最笨的辦法——窮舉法。就是用兩個(gè)嵌套循環(huán)將范圍內(nèi)所有β值和S0值都試一遍,計(jì)算每次嘗試結(jié)果與實(shí)際數(shù)據(jù)之間差值的平方和,平方和最小的一組β值和S0值用來做預(yù)測。代碼如下:
γ值設(shè)定為0.04,即一般病程25天
用最小二乘法估計(jì)β值和初始易感人數(shù)
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)] # 定義偏差函數(shù) def error(res): err = (data["感染者"] - res)**2 errsum = sum(err) return errsum # 窮舉法,找出與實(shí)際數(shù)據(jù)差的平方和最小的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 # 數(shù)值解模型方程 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))
結(jié)果 S0 = 39000, β = 8e-6
上述程序耗時(shí)較長,只在探索時(shí)執(zhí)行,完了就注釋掉,用最優(yōu)參數(shù)進(jìn)行預(yù)測。
預(yù)測最大感染人數(shù):23769 時(shí)間是在1月10日的33天后,也就是2月12日。
本文代碼:https://github.com/zwdnet/2019-nCov-SIRmodel
與[7]作者討論,我的算法是將S0與β作為獨(dú)立的兩個(gè)變量用兩個(gè)循環(huán)嵌套分別遍歷,他的做法是用每個(gè)S0的值代入微分方程算出相應(yīng)的β值。他的算法應(yīng)該更好一些,我正在嘗試。另外在微信公眾號上看到一篇更系統(tǒng)的關(guān)于此次疫情的數(shù)學(xué)模型的文章:https://mp.weixin.qq.com/s/rgaJtA4jioLOCHs_oCauDg
再次聲明:本文只是我個(gè)人在家無聊的游戲作品,不是正兒八經(jīng)的預(yù)測。我也不是流行病學(xué)專業(yè)人士。祝疫情早日結(jié)束!武漢加油!中國加油!
總結(jié)
以上所述是小編給大家介紹的python模擬預(yù)測一下新型冠狀病毒肺炎的數(shù)據(jù),希望對大家有所幫助!
相關(guān)文章
python使用adbapi實(shí)現(xiàn)MySQL數(shù)據(jù)庫的異步存儲
這篇文章主要為大家詳細(xì)介紹了python使用adbapi實(shí)現(xiàn)MySQL數(shù)據(jù)庫的異步存儲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03Python中break語句和continue語句的用法講解
在Python中,break語句和continue語句一般用于循環(huán)語句中,這篇文章主要介紹了Python中break語句和continue語句的用法小結(jié),需要的朋友可以參考下2022-12-12python中round函數(shù)保留兩位小數(shù)的方法
在本篇內(nèi)容里小編給各位分享的是一篇關(guān)于python中round函數(shù)保留兩位小數(shù)的方法及相關(guān)知識點(diǎn),有興趣的朋友們可以學(xué)習(xí)下。2020-12-12python虛擬環(huán)境virtualenv的安裝與使用
virtualenv用于創(chuàng)建獨(dú)立的Python環(huán)境,多個(gè)Python相互獨(dú)立,互不影響,它能夠:1. 在沒有權(quán)限的情況下安裝新套件 2. 不同應(yīng)用可以使用不同的套件版本 3. 套件升級不影響其他應(yīng)用2017-09-09python基于機(jī)器學(xué)習(xí)預(yù)測股票交易信號
近年來,隨著技術(shù)的發(fā)展,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)在金融資產(chǎn)量化研究上的應(yīng)用越來越廣泛和深入。目前,大量數(shù)據(jù)科學(xué)家在Kaggle網(wǎng)站上發(fā)布了使用機(jī)器學(xué)習(xí)/深度學(xué)習(xí)模型對股票、期貨、比特幣等金融資產(chǎn)做預(yù)測和分析的文章。本文就來看看如何用python預(yù)測股票交易信號2021-05-05Windows系統(tǒng)中將Python添加到系統(tǒng)環(huán)境詳細(xì)圖文教程
當(dāng)在命令行使用python或pip指令時(shí),可能會遇到pip不是內(nèi)部命令的報(bào)錯(cuò),這通常是因?yàn)樵诎惭bPython時(shí)未將其添加至系統(tǒng)環(huán)境變量,或者有多個(gè)Python環(huán)境導(dǎo)致路徑不一致,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10使用pycharm和pylint檢查python代碼規(guī)范操作
這篇文章主要介紹了使用pycharm和pylint檢查python代碼規(guī)范操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06