2017-01-17 9 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_MAPSliceサンプラーを使用することができますが、それはNUTSで失敗します。エラーメッセージは次のとおりです。

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

私はNUTSだけなぜそれがexpmのヘッセ行列を取るしようとしている、勾配に関する情報が必要だと思いましたか?

+0

"離散的なもの"と言えば、何か壊れてしまうと思います:)「expm」とは何ですか?それは分化可能ですか? –

+0

'expm'は行列の指数関数であり、その導関数はtheanoに実装されています。分布は離散的であるが、そのパラメータに関して連続的である。 – nbren12

答えて

0

Pymc3は、NUTSアルゴリズムを使用するときにパラメータのステップサイズと方向性を設定するために、パラメータ空間でヘッセ行列が必要であると考えました。たぶんExpmGradのグラデーションを自分で定義することができます。 ここでは相対的な議論がありますhttps://github.com/pymc-devs/pymc3/issues/1226

関連する問題