2017-01-17 1 views
0

Я пытаюсь сделать вывод о генераторе непрерывного марковского процесса, наблюдаемого с дискретными интервалами. Если генератор марковского процесса равен $ 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?

+0

Вы упоминаете «дискретный», что-то заставляет меня думать, что что-то сломается :) Что такое 'expm'? Это дифференцируемо? –

+0

'expm' - матричная экспоненциальная функция, а ее производная реализована в anano. Распределение дискретно, но оно непрерывно по отношению к его параметрам. – nbren12

ответ

0

Я думал, что Pymc3 нуждается в Hessian в пространстве параметров, чтобы установить размер шага и направленность для параметров при использовании алгоритма NUTS. Возможно, вы сами можете определить град ExpmGrad. Относительно обсуждается здесь https://github.com/pymc-devs/pymc3/issues/1226