做者:林澤龍 Mo前端
2019 新型冠狀病毒 (SARS-CoV-2),曾用名 2019-nCoV,通用簡稱新冠病毒,是一種具備包膜的正鏈單股 RNA 冠狀病毒,爲 2019 年末出現的新型冠狀病毒感染的肺炎疫情的病原。在疫情爆發期間,研究人員對肺炎陽性患者樣本進行核酸檢測以及基因組測序後發現了這一病毒。python
現在疫情成了人們最爲關心的話題,經過各方的努力疫情也獲得了相應的控制,對於疫情的預測許多專業的人士也有不一樣見解,本文就基於兩個簡單的模型來預測和分析疫情的數據,固然結果也僅供參考。網絡
本文數據包含新型冠狀病毒肺炎疫情數據和2003年中國非典疫情數據,其中新型冠狀病毒數據主要來自國家衛健委官網和其餘各大門戶網站,非典數據主要來自世界衛生組織。其中新型冠狀病毒數據主要用邏輯迴歸函數來擬合,非典數據主要用來訓練LSTM模型,而後基於該模型來分析新型冠狀病毒數據。app
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:邏輯增加函數擬合後的結果網站
若是有興趣能夠經過最下方的項目地址查看最新數據和所有代碼。人工智能
長短時間記憶(Long short-term memory, LSTM)是一種特殊的RNN,LSTM 神經元能夠存儲時序信息,來解決上下文和時間問題,且沒有影響其性能的消失梯度問題。通俗來說,若是一個比較好的 LSTM 模型,咱們就能夠利用昨天和今天的數據來準確的預測明天的數據。關於 LSTM 的介紹在往期的文章中有過介紹,這裏就再也不贅述了,有興趣的能夠點擊LSTM股票市場預測入門查看。
因爲利用神經網絡訓練須要大量的數據,而新型冠狀病毒的數據量目前較少,因此選擇了數據稍微多些的2003年非典數據,數據是從2003年3月17日至2003年7月11日的感染人數和死亡人數的數據,數據格式以下。
圖3:非典數據格式
因爲數據並不連續,因此咱們將中間缺失的數據進行處理,主要方法是取前一天的數據和以後第一天未缺失的數據相加的平均值做爲缺失數據的值。代碼以下:
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
歸一化能夠使模型訓練更快和取得更好的結果,因此咱們也能夠利用起來。
#歸一化 scaler = MinMaxScaler(feature_range=(0, 1)) dataset = scaler.fit_transform(dataset)
因爲數據較少,咱們取得時間步長爲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 取2 timestep = 1 trainX,trainY = create_dataset(dataset,timestep )
咱們的數據十分的簡單,所以也不須要複雜的網絡,代碼主要用了 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")
下面兩圖展示了非典數據訓練的結果和模型預測新型冠狀病毒的對比。能夠發現 LSTM 能夠大概的預測後一天的病情發展,但因爲2月12日湖北地區確診方式改變致使了人數暴增,不過如今病情已經趨於穩定。但願人們生活能夠早日恢復正常,患者早日康復。項目地址:https://momodel.cn/workspace/5e44fecd6f6696a6d279f612?type=app
如下爲實際的訓練結果
圖4:模型在訓練集上的結果
圖5:利用模型分析預測新型冠狀病毒曲線
1.使用Logistic 增加模型擬合2019-nCov肺炎感染確診人數
2. LSTM股票市場預測入門
3.利用 LSTM 進行家庭用戶用電預測
Mo(網址:https://momodel.cn)是一個支持 Python 的人工智能在線建模平臺,能幫助你快速開發、訓練並部署模型。
Mo人工智能俱樂部 是由 Mo 的研發與產品團隊發起、致力於下降人工智能開發與使用門檻的俱樂部。團隊具有大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具有從底層到前端的全線設計開發能力。主要研究方向爲大數據管理分析與人工智能技術,並以此來促進數據驅動的科學研究。