Я новичок в Pymc3, во время кодирования у меня возникают следующие вопросы:
Эта модель была построена для получения значений параметров модели SEIR эпидеми c.
Сначала создайте наблюдаемое значение yobs
.
import matplotlib.pyplot as plt
import numpy as np
# 参数设置
T = 100
S, E, I, R = np.zeros(shape=T), np.zeros(
shape=T), np.zeros(shape=T), np.zeros(shape=T)
N = 10000
E[0] = 0
I[0] = 1
S[0] = N-I[0]
R[0] = 0
beta = 0.6
sigma = 0.1
gamma = 0.1
def seir(t, p1, p2, p3):
S[t+1] = S[t]-p1*S[t]*I[t]/N
E[t+1] = E[t]+p1*S[t]*I[t]/N-p2*E[t]
I[t+1] = I[t]+p2*E[t]-p3*I[t]
R[t+1] = R[t]+p3*I[t]
return S, E, I, R
for t in range(T-1):
S, E, I, R = seir(t, beta, sigma, gamma)
yobs=np.stack([S,E,I,R],axis=1)
Затем создайте модель SEIR с помощью Pymc3 со ссылкой на учебное пособие.
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import numpy as np
import pymc3 as pm
from pymc3.ode import DifferentialEquation
t = np.linspace(0, 100, 100)
def seir(y, t, p):
dSdt = -(p[0] * y[0] * y[2] / N)
dEdt = p[0] * y[0] * y[2] / N - p[1]*y[1]
dIdt = p[1]*y[1]-p[2]*y[2]
dRdt = p[2]*y[2]
return [dSdt, dEdt, dIdt, dRdt]
seir_model=DifferentialEquation(seir,times=t,n_states=4,n_theta=3,t0=0)
with pm.Model() as model:
beta = pm.Uniform('beta',0,1)
sigma = pm.Uniform('sigma',0,0.5)
gamma = pm.Uniform('gamma',0,0.5)
sigma_2 = pm.HalfCauchy('sigma_2',1)
seir_curves = seir_model(y0=[9999, 100, 10, 1], theta=[beta, sigma, gamma])
Yobs = pm.Normal('Y', mu=pm.math.log(seir_curves), sd=sigma_2, observed=yobs)
for RV in model.basic_RVs:
print(RV.name, RV.logp(model.test_point))
Когда я на этом этапе, мне интересно значение pm.math.log(seir_curves)
и seir_curves
, а также в этой строке:
Yobs = pm.Normal('Y', mu=pm.math.log(seir_curves), sd=sigma_2, observed=yobs)
Почему mu
и sd
должны быть такими значениями?
Этот вопрос кажется глупым, но я буду признателен, если кто-нибудь ответит мне или дай мне несколько советов.