【机器学习实战】意大利Covid-19病毒感染数学模型及预测
作者:Gianluca Malato? ? ? ? ?deephub翻譯組:劉欣然
當(dāng)今世界正在與一個新的敵人作斗爭,那就是Covid-19病毒。
該病毒自首次在中國出現(xiàn)以來,在世界范圍內(nèi)迅速傳播。不幸的是,意大利的Covid-19感染人數(shù)是歐洲最高的,為19人。我們是西方世界第一個面對這個新敵人的國家,我們每天都在與這種病毒帶來的經(jīng)濟和社會影響作斗爭。
在本文中,我將用Python向您展示感染增長的簡單數(shù)學(xué)分析和兩個模型,以更好地理解感染的演變。
數(shù)據(jù)收集(Data collection)
意大利民防部門每天都會更新感染者的累積數(shù)據(jù)。這些數(shù)據(jù)在GitHub上作為開放數(shù)據(jù)公開在Github這里:
https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-andamento-nazionale/dpc-covid19-ita-andamento-nazionale.csv
我的目標(biāo)是創(chuàng)建迄今為止受感染人數(shù)(即實際感染人數(shù)加上已感染人數(shù))的時間序列模型。這些模型具有參數(shù),這些參數(shù)將通過曲線擬合進(jìn)行估算。
我們用Python來做。
首先,讓我們導(dǎo)入一些庫。
import pandas as pd import numpy as np from datetime import datetime,timedelta from sklearn.metrics import mean_squared_error from scipy.optimize import curve_fit from scipy.optimize import fsolve import matplotlib.pyplot as plt %matplotlib inline現(xiàn)在,讓我們看一下原始數(shù)據(jù)。
url = https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-andamento-nazionale/dpc-covid19-ita-andamento-nazionale.csv df =pd.read_csv(url)我們需要的列是' totale_casi ',它包含到目前為止的累計感染人數(shù)。
這是原始數(shù)據(jù)。現(xiàn)在,讓我們?yōu)榉治鲎鰷?zhǔn)備。
數(shù)據(jù)準(zhǔn)備(Data preparation)
首先,我們需要將日期改為數(shù)字。我們將從一月一日起開始算。
df =df.loc[:,['data','totale_casi']] FMT ='%Y-%m-%d %H:%M:%S' date =df['data'] df['data']= date.map(lambda x : (datetime.strptime(x, FMT) -datetime.strptime("2020-01-01 00:00:00", FMT)).days )現(xiàn)在,我們可以分析要參加測試的兩個模型,分別是邏輯函數(shù)(logistic function)和指數(shù)函數(shù)(exponential function)。
每個模型都有三個參數(shù),這些參數(shù)將通過對歷史數(shù)據(jù)進(jìn)行曲線擬合計算來估計。
logistic模型(The logistic model)
logistic模型被廣泛用于描述人口的增長。感染可以被描述為病原體數(shù)量的增長,因此使用logistic模型似乎是合理的。
這個公式在數(shù)據(jù)科學(xué)家中非常有名,因為它被用于邏輯回歸分類器,并且是神經(jīng)網(wǎng)絡(luò)的一個激活函數(shù)。
logistic函數(shù)最一般的表達(dá)式為:
在這個公式中,我們有變量x(它是時間)和三個參數(shù):a,b,c。
?a為感染速度
?b為感染發(fā)生最多的一天
?c是在感染結(jié)束時記錄的感染者總數(shù)
在高時間值時,被感染的人數(shù)越來越接近c值,也就是我們說感染已經(jīng)結(jié)束的時間點。這個函數(shù)在b點也有一個拐點,也就是一階導(dǎo)數(shù)開始下降的點(即感染開始減弱并下降的峰值)。
讓我們在Python中定義模型:
def logistic_model(x,a,b,c):return c/(1+np.exp(-(x-b)/a))我們可以使用scipy庫中的curve_fit函數(shù)從原始數(shù)據(jù)開始估計參數(shù)值和錯誤。
x =list(df.iloc[:,0]) y =list(df.iloc[:,1]) fit = curve_fit(logistic_model,x,y,p0=[2,100,20000])這里是一些值:
a= 3.54 b= 68.00 c= 15968.38該函數(shù)也返回協(xié)方差矩陣,其對角值是參數(shù)的方差。取它們的平方根,我們就能計算出標(biāo)準(zhǔn)誤差。
errors= [np.sqrt(fit[1][i][i]) for i in [0,1,2]]· a的標(biāo)準(zhǔn)誤差:0.24 · b的標(biāo)準(zhǔn)誤差:1.53 · c的標(biāo)準(zhǔn)誤差:4174.69這些數(shù)字給了我們許多有用的見解。
預(yù)計感染人數(shù)在感染結(jié)束時為15968+/-4174。
感染高峰預(yù)計在2020年3月9日左右。
預(yù)期的感染結(jié)束日期可以計算為受感染者累計計數(shù)四舍五入約等于到最接近整數(shù)的c參數(shù)的那一天。
我們可以使用scipy的fsolve函數(shù)來計算出定義感染結(jié)束日的方程的根。
sol =int(fsolve(lambda x : logistic_model(x,a,b,c) - int(c),b))求解出來時間是2020年4月15日。
指數(shù)模型(Exponential model)
logistic模型描述了未來將會停止的感染增長,而指數(shù)模型描述了不可阻擋的感染增長。例如,如果一個病人每天感染2個病人,1天后我們會有2個感染,2天后4個,3天后8個,等等。
最通用的指數(shù)函數(shù)是:
變量x是時間,我們?nèi)匀挥袇?shù)a, b, c,但是它的意義不同于logistic函數(shù)參數(shù)。
讓我們在Python中定義這個函數(shù),并執(zhí)行與logistic增長相同的曲線擬合過程。
def exponential_model(x,a,b,c):return a*np.exp(b*(x-c)) exp_fit =curve_fit(exponential_model,x,y,p0=[1,1,1])參數(shù)及其標(biāo)準(zhǔn)差為:
· a: 0.0019 +/- 64.6796 · b: 0.2278 +/- 0.0073 · c: 0.50 +/- 144254.77畫圖
我們現(xiàn)在有了所有必要的數(shù)據(jù)來可視化我們的結(jié)果。
pred_x= list(range(max(x),sol)) plt.rcParams['figure.figsize']= [7, 7] plt.rc('font',size=14)## Realdata plt.scatter(x,y,label="Real data",color="red") #Predicted logistic curve plt.plot(x+pred_x,[logistic_model(i,fit[0][0],fit[0][1],fit[0][2]) for i in x+pred_x], label="Logistic model" ) #Predicted exponential curve plt.plot(x+pred_x,[exponential_model(i,exp_fit[0][0],exp_fit[0][1],exp_fit[0][2])for i in x+pred_x], label="Exponential model" ) plt.legend() plt.xlabel("Days since 1 January 2020") plt.ylabel("Total number of infected people") plt.ylim((min(y)*0.9,c*1.1)) plt.show()這兩條理論曲線似乎都很接近實驗趨勢。哪一個更好?讓我們看一下殘差(residuals.)。
殘差分析
殘差是指各實驗點與相應(yīng)理論點的差值。我們可以通過分析兩種模型的殘差來驗證最佳擬合曲線。在第一次近似中,理論和實驗數(shù)據(jù)的均方誤差越小,擬合越好。
y_pred_logistic=[logistic_model(i,fit[0][0],fit[0][1],fit[0][2]) for i in x] y_pred_exp = [exponential_model(i,exp_fit[0][0], exp_fit[0][1], exp_fit[0][2]) for i in x] mean_squared_error(y,y_pred_logistic) mean_squared_error(y,y_pred_exp)Logistic模型MSE(均方誤差):
251977.62指數(shù)模型MSE:
2873584.27哪個是正確的模型?
殘差分析似乎指向邏輯模型。很可能是因為感染應(yīng)該會在將來的某一天結(jié)束;即使每個人都會被感染,他們也會適當(dāng)?shù)匕l(fā)展出免疫防御措施以避免再次感染。只要病毒沒有發(fā)生太多變異(例如,流感病毒),這就是正確的模型。
本文作者:
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復(fù)“加群”獲取一折本站知識星球優(yōu)惠券,請回復(fù)“知識星球”喜歡文章,點個在看
總結(jié)
以上是生活随笔為你收集整理的【机器学习实战】意大利Covid-19病毒感染数学模型及预测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【推荐系统】深入理解YouTube推荐系
- 下一篇: 【算法知识】详解选择排序算法