我试图推断以离散间隔观察到的连续马尔可夫过程的发生器。如果马尔可夫过程的生成器是$ 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_MAP
和Slice
采样器,但它会失败并显示NUTS
。错误消息是:
AttributeError: 'ExpmGrad' object has no attribute 'grad'
我认为NUTS只需要有关渐变的信息,为什么它试图采用expm
的Hessian?
答案 0 :(得分:0)
我认为Pymc3在参数空间中需要Hessian来设置使用NUTS算法时参数的步长和方向性。也许你可以自己定义ExpmGrad的毕业。 相对讨论在这里https://github.com/pymc-devs/pymc3/issues/1226