1

让我们生成一些测试数据:

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在之前switchpointexponential_model之后使用的正确方法是什么?

4

1 回答 1

0

该开关可用于计算适当的musigma用于观察模型,例如:

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)
于 2020-03-14T17:30:06.280 回答