python – PyMC3在模型中选择用于切换点分析的数据

我正在制作一个在中间发生剧烈变化的时间序列.

import numpy as np

size = 120 
x1 = np.random.randn(size)
x2 = np.random.randn(size) * 4
x = np.hstack([x1, x2])

这一系列的x看起来像这样:

《python – PyMC3在模型中选择用于切换点分析的数据》

现在的目标是使用PyMC3来估计发生变化的时间的后验分布(切换点).这应该发生在索引120周围.我使用了以下代码;

from pymc3 import Model, Normal, HalfNormal, DiscreteUniform
basic_model = Model()

with basic_model:
    mu1 = Normal('mu1', mu=0, sd=10)
    mu2 = Normal('mu2', mu=0, sd=10)
    sigma1 = HalfNormal('sigma1', sd=2)
    sigma2 = HalfNormal('sigma2', sd=2)
    tau = DiscreteUniform('tau', 0, 240)

    # get likelihoods
    y1 = Normal('y1', mu=mu1, sd=sigma1, observed=x[:tau])
    y2 = Normal('y2', mu=mu2, sd=sigma2, observed=x[tau:])

这样做会产生一个错误,我无法使用tau来切割数组.在PyMC中解决这个问题的方法是什么?好像我需要在PyMC中通过随机的东西来完成切片.

最佳答案 原来PyMC3有一个开关模型.设t是时间的变量.

import pymc3 as pm
basic_model = pm.Model()

with basic_model:
    mu1 = pm.Normal('mu1', mu=0, sd=10)
    mu2 = pm.Normal('mu2', mu=0, sd=10)
    sigma1 = pm.HalfNormal('sigma1', sd=2)
    sigma2 = pm.HalfNormal('sigma2', sd=2)
    switchpoint = pm.DiscreteUniform('switchpoint', t.min(), t.max())

    tau_mu = pm.switch(t >= switchpoint, mu1, mu2)
    tau_sigma = pm.switch(t >= switchpoint, sigma1, sigma2)

    y = pm.Normal('y1', mu=tau_mu, sd=tau_sigma, observed=x)
点赞