使用NUTS采样器获得矩阵指数的似然性

时间:2017-01-17 01:29:33

标签: pymc3

我试图推断以离散间隔观察到的连续马尔可夫过程的发生器。如果马尔可夫过程的生成器是$ T $,那么离散时间间隔的随机矩阵由$ P = \ exp(T \ Delta t)$给出。为了使用pymc实现这一点,我编写了自定义分发类

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_MAPSlice采样器,但它会失败并显示NUTS。错误消息是:

AttributeError: 'ExpmGrad' object has no attribute 'grad'

我认为NUTS只需要有关渐变的信息,为什么它试图采用expm的Hessian?

1 个答案:

答案 0 :(得分:0)

我认为Pymc3在参数空间中需要Hessian来设置使用NUTS算法时参数的步长和方向性。也许你可以自己定义ExpmGrad的毕业。 相对讨论在这里https://github.com/pymc-devs/pymc3/issues/1226