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
のヘッセ行列を取るしようとしている、勾配に関する情報が必要だと思いましたか?
"離散的なもの"と言えば、何か壊れてしまうと思います:)「expm」とは何ですか?それは分化可能ですか? –
'expm'は行列の指数関数であり、その導関数はtheanoに実装されています。分布は離散的であるが、そのパラメータに関して連続的である。 – nbren12