Как использовать PyMC3 для реализации модели скрытого состояния с периодичностью?

Я пытаюсь построить модель PyMC3, которая имеет следующие компоненты:

  1. Ежегодный дрейф, смоделированный как GaussianRandomWalk,
  2. Периодический элемент более года с 2-месячными длинными шагами.
  3. Другие простые предикторы, все / в основном смоделированные как нормальные распределения.

Прочитав большую часть документации по PyMC3, я подумал, что гауссовский процесс с периодической ковариацией будет лучше всего моделировать периодический элемент. Проблема в том, что я не могу заставить работать общую модель, и, насколько я понимаю, в документации приведены примеры, представленные PyMC3, в основном или во всех случаях, когда GP не сочетаются с более простыми дистрибутивами, и каждый раз я При попытке запустить модель весь ноутбук Jupyter не работает и перезагружается. Я следовал предложению документации, что вы генерируете априор для использования как часть большей модели:

import pymc3 as pm
import numpy as np

# Import the data...

# Implement a hidden state model that captures yearly and within-year periodic trends, as well as using simple predictors.
with pm.Model() as model:
    # We use a GaussianRandomWalk here, but could be other timeseries instead.
    year_movement_sd = pm.Exponential('year_movement_sd', 10)
    year_movement = pm.GaussianRandomWalk('year_movement', sd=year_movement_sd, shape=(num_years,))

    periodic_period = pm.Normal('periodic_period', mu=6, sd=1)
    periodic_psmooth = pm.Gamma('periodic_psmooth', alpha=4, beta=3)
    periodic_cov = pm.gp.cov.Periodic(1, periodic_period, periodic_psmooth)
    periodic_gp_latent = pm.gp.Latent(cov_func=periodic_cov)
    periodic_gp_prior = periodic_gp_latent.prior('periodic_gp_prior', X=which_sixth) # I'ved tried this step with one-dimensional arrays, (1, 1)-shaped arrays, (n, 1) and (1, n) shaped arrays...

    predictors_coeff = pm.Normal('predictors_coeff', mu=0, sd=100*2, shape=predictors_values.shape[1])

    model_error = pm.HalfStudentT('model_error', nu=1.0, sd=100000)

    productivity_obs = pm.Deterministic('productivity_obs', year_movement[year_values] + periodic_gp_prior + predictors_coeff*predictors_values)

with model:
    # ... sample/fit the model. Currently using variational inference for speed until model works correctly.

Я довольно новичок в моделировании более сложных моделей с помощью PyMC3, но раньше немного использовал библиотеку с иерархическими моделями. Что я здесь делаю не так (возможно, мне нужно также моделировать годовой компонент как GP более низкого уровня?), Или есть более простой способ для моделирования периодичности?

0 ответов

Другие вопросы по тегам