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
)有不同测量误差的理由是什么?我会使用开关来确定地计算a
mu
,然后唯一观察到的是a
pm。正常的
mu
和一个常见的测量误差。不需要不同的sigma,我会简化,谢谢你,不用担心,我最终写了一个通用的答案来切换mu和sigma。但是我没有测试它-不完全确定元组赋值在Theano计算图上下文中是否发挥良好作用。两个区域(
sigma\u 0
sigma\u 1
)有不同测量误差的理由是什么?我会使用开关来确定地计算a
mu
,然后唯一观察到的是a
pm。正常的
mu
和一个常见的测量误差。不需要不同的sigma,我会简化,谢谢你,不用担心,我最终写了一个通用的答案来切换mu和sigma。但是我没有测试它-不完全确定元组赋值在Theano计算图上下文中是否发挥良好作用。