1. 背景
2019 新型冠狀病毒 (SARS-CoV-2),曾用名 2019-nCoV,通用簡稱新冠病毒,是一種具有包膜的正鏈單股 RNA 冠狀病毒,為 2019 年底出現的新型冠狀病毒感染的肺炎疫情的病原。在疫情爆發期間,研究人員對肺炎陽性患者樣本進行核酸檢測以及基因組測序後發現了這一病毒。
如今疫情成了人們最為關心的話題,通過各方的努力疫情也得到了相應的控制,對於疫情的預測許多專業的人士也有不同看法,本文就基於兩個簡單的模型來預測和分析疫情的數據,當然結果也僅供參考。
2. 數據採集
本文數據包含新型冠狀病毒肺炎疫情數據和2003年中國非典疫情數據,其中新型冠狀病毒數據主要來自 國家衛健委官網 和其他各大門戶網站,非典數據主要來自 世界衛生組織 。其中新型冠狀病毒數據主要用邏輯回歸函數來擬合,非典數據主要用來訓練LSTM模型,然後基於該模型來分析新型冠狀病毒數據。
3. 利用 Logistic 函數擬合曲線
Logistic函數或Logistic曲線是一種常見的S形函數,它是皮埃爾·弗朗索瓦·韋呂勒在1844或1845年在研究它與人口增長的關係時命名的。該模型廣泛應用於生物繁殖和生長過程、人口增長過程模擬。該函數公式如下,
$$P(t)=\\frac{KP_0e^rt}{K+(P_0e^rt-1)}$$
其中為$P_0$初始值,$K$為終值,$r$衡量曲線變化快慢,$t$為時間。
接下去就是要用已有的數據,擬合出上述方程得出最優參數。我們的數據格式如下,統計時間從1月10至2月14日。我們主要去擬合全國確診人數。
圖1:最新疫情數據格式
我們的代碼是設定該函數後利用最小二乘法去擬合數據。代碼如下:
def logistic_increase_function(t,K,P0,r): t0=1 r=0.2# r值越大,模型越快收斂到K,r值越小,越慢收斂到K exp_value=np.exp(r*(t-t0)) return (K*exp_value*P0)/(K+(exp_value-1)*P0)# 用最小二乘法估計擬合 參數t為時間 P為對應時間的確診人數popt, pcov = curve_fit(logistic_increase_function, t, P)#popt裡面是擬合後的最優參數係數print("K:",popt[0],"P0:",popt[1],"r:",popt[2])
最終擬合後的預測函數和以往數據的對比圖如下:
圖2:邏輯增長函數擬合後的結果
如果有興趣可以通過最下方的項目地址查看最新數據和全部代碼。
4. 利用LSTM模型預測感染人數
長短期記憶(Long short-term memory, LSTM)是一種特殊的RNN,LSTM 神經元可以存儲時序信息,來解決上下文和時間問題,且沒有影響其性能的消失梯度問題。通俗來講,如果一個比較好的 LSTM 模型,我們就可以利用昨天和今天的數據來準確的預測明天的數據。關於 LSTM 的介紹在往期的文章中有過介紹,這裡就不再贅述了,有興趣的可以點擊 LSTM股票市場預測入門 查看。
由於利用神經網絡訓練需要大量的數據,而新型冠狀病毒的數據量目前較少,所以選擇了數據稍微多些的2003年非典數據,數據是從2003年3月17日至2003年7月11日的感染人數和死亡人數的數據,數據格式如下。
圖3:非典數據格式
4.1數據預處理
由於數據並不連續,所以我們將中間缺失的數據進行處理,主要方法是取前一天的數據和之後第一天未缺失的數據相加的平均值作為缺失數據的值。代碼如下:
dataframe = pd.read_csv('SARS.csv',usecols=[1])for i in range(dataframe['total'].shape[0]): if dataframe['total'][i] == 0: j=i+1 while(dataframe['total'][j]==0): j+=1 dataframe['total'][i]=(dataframe['total'][i-1]+dataframe['total'][j])//2
4.2歸一化處理
歸一化可以使模型訓練更快和取得更好的結果,所以我們也可以利用起來。
#歸一化scaler = MinMaxScaler(feature_range=(0, 1))dataset = scaler.fit_transform(dataset)
4.2數據處理
由於數據較少,我們取得時間步長為2,即是用近兩天的結果預測第三天的結果。代碼如下:
def create_dataset(dataset, timestep ): dataX, dataY = [], [] for i in range(len(dataset)-timestep -1): a = dataset[i:(i+timestep )] dataX.append(a) dataY.append(dataset[i + timestep ]) return np.array(dataX),np.array(dataY)#訓練數據太少 timestep 取2timestep = 1trainX,trainY = create_dataset(dataset,timestep )
4.3網絡構建
我們的數據十分的簡單,因此也不需要複雜的網絡,代碼主要用了 keras 框架。
model = Sequential()model.add(LSTM(4, input_shape=(None,1)))model.add(Dense(1))model.compile(loss='mean_squared_error', optimizer='adam')model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)model.save("LSTM.h5")
4.4最終結果
下面兩圖展現了非典數據訓練的結果和模型預測新型冠狀病毒的對比。可以發現 LSTM 可以大概的預測後一天的病情發展,但由於2月12日湖北地區確診方式改變導致了人數暴增,不過現在病情已經趨於穩定。希望人們生活可以早日恢復正常,患者早日康復。項目地址: https://momodel.cn/workspace/5e44fecd6f6696a6d279f612?type=app
以下為實際的訓練結果
圖4:模型在訓練集上的結果
圖5:利用模型分析預測新型冠狀病毒曲線