python實現logistic增長模型擬合2019-nCov確診人數

背景:衆志成城抗疫情。今天是2020年1月28日,2019-nCov確診人數一直在增長趨勢,如何更好的對確診人數進行擬合和預測,需要我們用python來實現。注意,本文模型爲logistic增長模型,並非最佳預測模型,只是大致預測,對之前的感染人數曲線進行擬合,以後的疫情發展情況還是需要根據實際情況得出。模型根據2020年1月28日及之前的數據進行擬合,後續可能會更新。

目錄

一、logistic增長

1.1 J型增長和S型增長

1.2 logistic增長函數

二、python對函數曲線的擬合

2.1 定義散點座標

2.2 用最小二乘法進行擬合

三、疾病下步發展估計

3.1 不加人爲干預

3.2 樂觀預計模型

3.3 最樂觀預計模型

3.4 停止增長時間

四、全部代碼


一、logistic增長

1.1 J型增長和S型增長

指數增長,J型曲線:指數增長,即增長不受抑制,呈爆炸式的。

比如一個人可以傳染三個人,三個人傳染九個人,九個人傳染27個人,不停的倍增。這就是J型增長,也叫指數型的增長。

一些傳染病初期可能呈現指數增長。

但是實際的增長過程中,增長速率並不能一直維持不變,隨着人數的不斷增多,增長率會逐漸受到抑制。這就是S型增長。

一般疾病的傳播是S型增長的過程,因爲疾病傳播的過程中會受到一定的阻力。

1.2 logistic增長函數

當一個物種遷入到一個新生態系統中後,其數量會發生變化。假設該物種的起始數量小於環境的最大容納量,則數量會增長。該物種在此生態系統中有天敵、食物、空間等資源也不足(非理想環境),則增長函數滿足邏輯斯諦方程,圖像呈S形,此方程是描述在資源有限的條件下種羣增長規律的一個最佳數學模型。在以下內容中將具體介紹邏輯斯諦方程的原理、生態學意義及其應用。邏輯斯蒂模型的微分式是:dx/dt=rx(1-x) 式中的r爲速率參數。

  • K爲環境容量,即增長到最後,P(t)能達到的極限。
  • P0爲初始容量,就是t=0時刻的數量。
  • r爲增長速率,r越大則增長越快,越快逼近K值,r越小增長越慢,越慢逼近K值。

該公式用python寫成函數形式就是:

def logistic_increase_function(t,K,P0,r):
    # t:time   t0:initial time    P0:initial_value    K:capacity  r:increase_rate
    exp_value=np.exp(r*(t-t0))
    return (K*exp_value*P0)/(K+(exp_value-1)*P0)

logistic增長的曲線也稱爲s型曲線。下圖左圖爲曲線數量,右圖爲增長速率。

二、python對函數曲線的擬合

如何用python對任意數據用任意函數的圖像進行擬合:

https://blog.csdn.net/changdejie/article/details/83089933

2.1 定義散點座標

定義是當日24時的累積確診人數,沒有詳細考證,可能有出入。

'''
1.11日41例
1.18日45例
1.19日62例
1.20日291例
1.21日440例
1.22日571例
1.23日830例
1.24日1287例
1.25日1975例
1.26日2744例
1.27日4515例
'''

t=[11,18,19,20 ,21, 22, 23, 24,  25,  26,  27]
t=np.array(t)
P=[41,45,62,291,440,571,830,1287,1975,2744,4515]
P=np.array(P)

2.2 用最小二乘法進行擬合

最小二乘法,對logistic增長函數進行擬合。


# 用最小二乘法估計擬合
popt, pcov = curve_fit(logistic_increase_function, t, P)
#獲取popt裏面是擬合係數
print("K:capacity  P0:initial_value   r:increase_rate   t:time")
print(popt)
#擬合後預測的P值
P_predict = logistic_increase_function(t,popt[0],popt[1],popt[2])
#未來預測
future=[11,18,19,20 ,21, 22, 23, 24,  25,  26,  27,28,29,30,31,41,51,61,71,81,91,101]
future=np.array(future)
future_predict=logistic_increase_function(future,popt[0],popt[1],popt[2])
#近期情況預測
tomorrow=[28,29,30,32,33,35,37,40]
tomorrow=np.array(tomorrow)
tomorrow_predict=logistic_increase_function(tomorrow,popt[0],popt[1],popt[2])

#繪圖
plot1 = plt.plot(t, P, 's',label="confimed infected people number")
plot2 = plt.plot(t, P_predict, 'r',label='predict infected people number')
plot3 = plt.plot(tomorrow, tomorrow_predict, 'b',label='predict infected people number')
plt.xlabel('time')
plt.ylabel('confimed infected people number')

plt.legend(loc=0) #指定legend的位置右下角

print(logistic_increase_function(np.array(28),popt[0],popt[1],popt[2]))
print(logistic_increase_function(np.array(29),popt[0],popt[1],popt[2]))
plt.show()

三、疾病下步發展估計

3.1 不加人爲干預

紅色曲線爲丁香醫生統計的實際感染人數曲線,下方圖片爲博主用最小二乘法用logistic函數增長擬合的,最終

K,P0,r的值分別爲[4.01665705e+10 5.36213622e+00 4.19963424e-01]

照此趨勢增長下去,最終K=4.01665705e+10人會被感染,顯然不可能。

此模型預測出明日1月28日24點感染人數累計6759人,1月29日24點累計感染人數10287人

3.2 樂觀預計模型

人爲干預後,疾病降低K值,因此可以將r值提升,以加快達到K值的速度。

r取0.55

明日1月28日凌晨24時累計確診5976,後日1日29日凌晨24時累計確診7533人,最終感染人數收斂在12000人左右。

3.3 最樂觀預計模型

即疾病快速逼近K值,r=0.65,

明日1月28日凌晨24時累計確診5533,後日1日29日凌晨24時累計確診6445人,最終感染人數收斂在8000人左右。

3.4 停止增長時間

按模型預計,2月5日左右確診感染人數能停止增長。

保持樂觀心態,積極預防,總會戰勝新型冠狀病毒。

四、全部代碼

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
擬合2019-nCov肺炎感染確診人數
"""
import numpy as np
import matplotlib.pyplot as plt
import math
import pandas as pd

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def logistic_increase_function(t,K,P0,r):
    t0=11
    r=0.65
 #   r = 0.55
    # t:time   t0:initial time    P0:initial_value    K:capacity  r:increase_rate
    exp_value=np.exp(r*(t-t0))
    return (K*exp_value*P0)/(K+(exp_value-1)*P0)

'''
1.11日41例
1.18日45例
1.19日62例
1.20日291例
1.21日440例
1.22日571例
1.23日830例
1.24日1287例
1.25日1975例
1.26日2744例
1.27日4515例
'''

#  日期及感染人數
t=[11,18,19,20 ,21, 22, 23, 24,  25,  26,  27]
t=np.array(t)
P=[41,45,62,291,440,571,830,1287,1975,2744,4515]
P=np.array(P)

# 用最小二乘法估計擬合
popt, pcov = curve_fit(logistic_increase_function, t, P)
#獲取popt裏面是擬合係數
print("K:capacity  P0:initial_value   r:increase_rate   t:time")
print(popt)
#擬合後預測的P值
P_predict = logistic_increase_function(t,popt[0],popt[1],popt[2])
#未來預測
future=[11,18,19,20 ,21, 22, 23, 24,  25,  26,  27,28,29,30,31,41,51,61,71,81,91,101]
future=np.array(future)
future_predict=logistic_increase_function(future,popt[0],popt[1],popt[2])
#近期情況預測
tomorrow=[28,29,30,32,33,35,37,40]
tomorrow=np.array(tomorrow)
tomorrow_predict=logistic_increase_function(tomorrow,popt[0],popt[1],popt[2])

#繪圖
plot1 = plt.plot(t, P, 's',label="confimed infected people number")
plot2 = plt.plot(t, P_predict, 'r',label='predict infected people number')
plot3 = plt.plot(tomorrow, tomorrow_predict, 's',label='predict infected people number')
plt.xlabel('time')
plt.ylabel('confimed infected people number')

plt.legend(loc=0) #指定legend的位置右下角

print(logistic_increase_function(np.array(28),popt[0],popt[1],popt[2]))
print(logistic_increase_function(np.array(29),popt[0],popt[1],popt[2]))
plt.show()


#未來預測繪圖
#plot2 = plt.plot(t, P_predict, 'r',label='polyfit values')
#plot3 = plt.plot(future, future_predict, 'r',label='polyfit values')
#plt.show()


print("Program done!")

 

博客文章總目錄-邢翔瑞的技術博客

支持向量機(Support Vector Machine,SVM)算法複雜度詳解

谷歌論文Weight Agnostic Neural Networks(WANN)權重無關神經網絡

王者榮耀中的數學原理及遊戲策略(一)防禦篇(護甲|魔抗|傷害運算機制)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章