Конусы байесовского предсказания PYMC3

Я все еще изучаю PYMC3, но не могу найти в документации ничего по следующей проблеме. Рассмотрим модель временных рядов байесовской структуры (BSTS) из этого вопроса без сезонности. Это можно смоделировать в PYMC3 следующим образом:

import pymc3, numpy, matplotlib.pyplot
# generate some test data
t = numpy.linspace(0,2*numpy.pi,100)
y_full = numpy.cos(5*t)
y_train = y_full[:90]
y_test = y_full[90:]

# specify the model
with pymc3.Model() as model:
  grw = pymc3.GaussianRandomWalk('grw',mu=0,sd=1,shape=y_train.size)
  y = pymc3.Normal('y',mu=grw,sd=1,observed=y_train)
  trace = pymc3.sample(1000)
  y_mean_pred = pymc3.sample_ppc(trace,samples=1000,model=model)['y'].mean(axis=0)

  fig = matplotlib.pyplot.figure(dpi=100)
  ax = fig.add_subplot(111)
  ax.plot(t,y_full,c='b')
  ax.plot(t[:90],y_mean_pred,c='r')
  matplotlib.pyplot.show()

Теперь я хотел бы предсказать поведение для следующих 10 временных шагов, то есть y_test. Я также хотел бы включить заслуживающие доверия регионы над этой областью, образующие байесовский конус, например, см. здесь . К сожалению, механизм производства колбочек в вышеупомянутом звене немного расплывчат. В более традиционной модели AR можно было узнать средние коэффициенты регрессии и вручную расширить среднюю кривую. Однако в этой модели BSTS нет очевидного способа сделать это. В качестве альтернативы, если бы были регрессоры, я мог бы использовать theano.shared и обновить его более мелкой / расширенной сеткой для импутации и экстраполяции с помощью sample_ppc, но это не совсем вариант в этой настройке. Возможно, sample_ppc здесь отвлекает, но неясно, как еще поступить. Любая помощь приветствуется.


person Paul    schedule 22.08.2017    source источник


Ответы (1)


Думаю следующую работу. Однако это супер неуклюжее и требует, чтобы я знал, на сколько заранее я хочу предсказать, прежде чем я буду тренироваться (в частности, он включает использование потоковой передачи или простой EDA). Я подозреваю, что есть способ получше, и я бы предпочел бы принять лучшее решение от кого-то с большим опытом работы с Pymc3

import numpy, pymc3, matplotlib.pyplot, seaborn

# generate some data
t = numpy.linspace(0,2*numpy.pi,100)
y_full = numpy.cos(5*t)
# mask the data that I want to predict (requires knowledge 
#   that one might not always have at training time).
cutoff_idx = 80
y_obs = numpy.ma.MaskedArray(y_full,numpy.arange(t.size)>cutoff_idx)

# specify and train the model, used the masked array to supply only 
#   the observed data
with pymc3.Model() as model:
  grw = pymc3.GaussianRandomWalk('grw',mu=0,sd=1,shape=y_obs.size)
  y = pymc3.Normal('y',mu=grw,sd=1,observed=y_obs)
  trace = pymc3.sample(5000)
  y_pred = pymc3.sample_ppc(trace,samples=20000,model=model)['y']
  y_pred_mean = y_pred.mean(axis=0)

  # compute percentiles
  dfp = numpy.percentile(y_pred,[2.5,25,50,70,97.5],axis=0)

  # plot actual data and summary posterior information
  pal = seaborn.color_palette('Purples')
  fig = matplotlib.pyplot.figure(dpi=100)
  ax = fig.add_subplot(111)
  ax.plot(t,y_full,c='g',label='true value',alpha=0.5)
  ax.plot(t,y_pred_mean,c=pal[5],label='posterior mean',alpha=0.5)
  ax.plot(t,dfp[2,:],alpha=0.75,color=pal[3],label='posterior median')
  ax.fill_between(t,dfp[0,:],dfp[4,:],alpha=0.5,color=pal[1],label='CR 95%')
  ax.fill_between(t,dfp[1,:],dfp[3,:],alpha=0.4,color=pal[2],label='CR 50%')
  ax.axvline(x=t[cutoff_idx],linestyle='--',color='r',alpha=0.25)
  ax.legend()
  matplotlib.pyplot.show()

Это выводит следующее, что кажется действительно плохим прогнозом, но, по крайней мере, код предоставляет значения из выборки.

введите описание изображения здесь

person Paul    schedule 29.08.2017