让我们生成一些测试数据:
import numpy as np
observed = np.hstack([np.arange(10)*0.1 + 3, np.exp(np.arange(15)*.2 + .2)])
它看起来像这样:
import matplotlib.pyplot as plt
plt.plot(observed, marker='o', linestyle="None");
我想将线性模型 ( y = a + bx
) 拟合到数据的第一部分,将指数增长模型 ( y = exp(a + bx)
) 拟合到数据的第二部分。但是让我们假装我不知道,先验,切换点在哪里。
我尝试在 pymc3 中编写此模型:
x = np.arange(len(observed))
with pm.Model() as model:
sigma_1 = pm.HalfCauchy("sigma_1", beta=10)
alpha_1 = pm.Normal("α_1", 0, sigma=20)
beta_1 = pm.Normal("β_1", 0, sigma=20)
sigma_0 = pm.HalfCauchy("sigma_0", beta=10)
alpha_0 = pm.Normal("α_0", 0, sigma=20)
beta_0 = pm.Normal("β_0", 0, sigma=20)
switchpoint = pm.DiscreteUniform("switchpoint", lower=0, upper=len(x) - 1)
exponential_growth = pm.Normal(
"exponential_growth",
mu=np.exp(alpha_1 + beta_1 * x),
sigma=sigma_1,
observed=observed,
)
linear_growth = pm.Normal(
"linear_growth", mu=alpha_0 + beta_0 * x, sigma=sigma_0, observed=observed
)
likelihood = pm.math.switch(switchpoint >= x, linear_growth, exponential_growth)
trace = sample(2000, cores=2)
当然,这仅适用于整个数据的两个模型。我没有以正确的方式组合它们。
指定我想linear_model
在之前switchpoint
和exponential_model
之后使用的正确方法是什么?