Я пытаюсь сделать вывод о генераторе непрерывного марковского процесса, наблюдаемого с дискретными интервалами. Если генератор марковского процесса равен $ T $, то стохастическая матрица для дискретных временных интервалов задается $ P = \ exp (T \ Delta t) $. Для реализации этого с помощью pymc, я написал пользовательский класс распределенияИспользование пробоотборника NUTS для вероятности с экспоненциальной матрицей
import pymc3
from pymc3.distributions import Discrete
from pymc3.distributions.dist_math import bound
class ContinuousMarkovChain(Discrete):
def __init__(self, t10=None, t01=None, dt=None, *args, **kwargs):
super(ContinuousMarkovChain, self).__init__(*args, **kwargs)
# self.p = p
# self.q = q
self.p = tt.slicetype
self.gt0 = (t01 >0) & (t10> 0)
T = tt.stacklists([[-t01, t01], [t10,-t10]])
self.p = ts.expm(T*dt)
def logp(self, x):
return bound(tt.log(self.p[x[:-1],x[1:]]).sum(), self.gt0)
я могу использовать find_MAP
и Slice
пробник с этим классом, но он терпит неудачу с NUTS
. Сообщение об ошибке:
AttributeError: 'ExpmGrad' object has no attribute 'grad'
Я думал, что NUTS нужна только информация о градиенте, так почему он пытается взять гессианом expm
?
Вы упоминаете «дискретный», что-то заставляет меня думать, что что-то сломается :) Что такое 'expm'? Это дифференцируемо? –
'expm' - матричная экспоненциальная функция, а ее производная реализована в anano. Распределение дискретно, но оно непрерывно по отношению к его параметрам. – nbren12