Python 用pymc3对部分数据拟合线性模型,对其余数据拟合指数增长模型
让我们生成一些测试数据:Python 用pymc3对部分数据拟合线性模型,对其余数据拟合指数增长模型,python,numpy,pymc3,probabilistic-programming,probabilistic-ds,Python,Numpy,Pymc3,Probabilistic Programming,Probabilistic Ds,让我们生成一些测试数据: 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)
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)
当然,这只适用于整个数据的两个模型。我没有以正确的方式组合它们
我想在切换点之前使用
线性
,在切换点之后使用指数
的正确方法是什么?该切换可用于计算观测模型的适当mu
和sigma
,如下:
switchpoint = pm.DiscreteUniform("switchpoint", lower=0, upper=len(x) - 1)
mu, sigma = pm.math.switch(switchpoint >= x,
(alpha_0 + beta_0 * x, sigma_0),
(np.exp(alpha_1 + beta_1 *x), sigma_1))
lik = pm.Normal('obs', mu=mu, sigma=sigma, observed=observed)
该开关可用于计算观测模型的适当
mu
和sigma
,如下所示:
switchpoint = pm.DiscreteUniform("switchpoint", lower=0, upper=len(x) - 1)
mu, sigma = pm.math.switch(switchpoint >= x,
(alpha_0 + beta_0 * x, sigma_0),
(np.exp(alpha_1 + beta_1 *x), sigma_1))
lik = pm.Normal('obs', mu=mu, sigma=sigma, observed=observed)
两个区域(
sigma_0
,sigma_1
)有不同测量误差的理由是什么?我会使用开关来确定地计算amu
,然后唯一观察到的是apm。正常的mu
和一个常见的测量误差。不需要不同的sigma,我会简化,谢谢你,不用担心,我最终写了一个通用的答案来切换mu和sigma。但是我没有测试它-不完全确定元组赋值在Theano计算图上下文中是否发挥良好作用。两个区域(sigma\u 0
,sigma\u 1
)有不同测量误差的理由是什么?我会使用开关来确定地计算amu
,然后唯一观察到的是apm。正常的mu
和一个常见的测量误差。不需要不同的sigma,我会简化,谢谢你,不用担心,我最终写了一个通用的答案来切换mu和sigma。但是我没有测试它-不完全确定元组赋值在Theano计算图上下文中是否发挥良好作用。