私はPyMC3、Theano、numpyを使い慣れていません。スタンのマニュアルで最初の「隠された」マルコフモデルを複製しようとしていました - 実際に状態が観察されたもの。しかし、私はTheanoと間違い、numpy、そしておそらく私にとって少し不思議そうなPyMC3ディストリビューションの後ろで何が起こっているのかを考えています。モデルのための私のコード以下である:PyMC3のシンプルな隠れマルコフモデルがTheanoエラーを投げる
import pandas as pd
dat_hmm = pd.read_csv('hmmVals.csv')
emission=dat_hmm.emission.values
state=dat_hmm.state.values
from pymc3 import Model, Dirichlet, Categorical
import numpy as np
basic_model = Model()
with basic_model:
#Model constants:
#num unique hidden states, num unique emissions, num instances
K=3; V=9; T=10
alpha=np.ones(K); beta=np.ones(V)
# Priors for unknown model parameters
theta = np.empty(K, dtype=object) #theta=transmission
phi = np.empty(K, dtype=object) #phi=emission
#observed emission, state:
w=np.empty(T, dtype=object); z=np.empty(T, dtype=object);
for k in range(K):
theta[k]=Dirichlet('theta'+str(k), alpha)
phi[k]=Dirichlet('phi'+str(k), beta)
# Likelihood (sampling distribution) of observations
for t in range(T):
w[t]=Categorical('w'+str(t),theta[state[t]], shape=1, observed=emission[t])
for t in range(2, T):
z[t]=Categorical('z'+str(t),phi[state[t-1]], shape=1, observed=state[t])
線「W [T] =カテゴリ( 'W' + STR(T)=放射観察シータ[状態[T]、形状= 1、[ t]) "はエラーを生成しますが、w0を埋め込むt = 0ではなく、t = 1でインデックス外のエラーを生成します。 state [1]、theta [state [t]]、およびemission [t]がすべて存在するため、コードライン自体にインデックスがありません。エラーメッセージは以下のとおりです。
Traceback (most recent call last):
File "/usr/local/lib/python3.4/dist-packages/pymc3/distributions/distribution.py", line 25, in __new__
return model.Var(name, dist, data)
File "/usr/local/lib/python3.4/dist-packages/pymc3/model.py", line 306, in Var
var = ObservedRV(name=name, data=data, distribution=dist, model=self)
File "/usr/local/lib/python3.4/dist-packages/pymc3/model.py", line 581, in __init__
self.logp_elemwiset = distribution.logp(data)
File "/usr/local/lib/python3.4/dist-packages/pymc3/distributions/discrete.py", line 400, in logp
a = tt.log(p[value])
File "/usr/local/lib/python3.4/dist-packages/theano/tensor/var.py", line 532, in __getitem__
lambda entry: isinstance(entry, Variable)))
File "/usr/local/lib/python3.4/dist-packages/theano/gof/op.py", line 668, in __call__
required = thunk()
File "/usr/local/lib/python3.4/dist-packages/theano/gof/op.py", line 883, in rval
fill_storage()
File "/usr/local/lib/python3.4/dist-packages/theano/gof/cc.py", line 1707, in __call__
reraise(exc_type, exc_value, exc_trace)
File "/usr/local/lib/python3.4/dist-packages/six.py", line 686, in reraise
raise value
IndexError: index out of bounds
私はPyMC3分布にnumpyのオブジェクトを貼り付けるか、別の分布をパラメータ化しようとすることの結果を使用しての知恵を知りませんが、私は、ウェブ上やや似たコードを見てきました、最後の部分をマイナスします。 PyMC3でこのような隠れマルコフモデルをコーディングする良い方法はないでしょうか?
PS PyMC3でHMMモデルを実装する際の問題に)、私の答えに投票してください。 – JasonK
自分の答えを正解として選ぶことができます。私はあなたのコードをチェックしていませんが、それをベクトル化しようとしましたか?おそらくほとんどの時間は、モデルのコンパイルとMAPの検索に費やされており、サンプリングは非常に高速です。 – aloctavodia
aloctavodiaに感謝し、私の遅い応答にご迷惑をかけています(休暇中でした)。上記はNUTSでは機能しません。メトロポリスでは、データと複雑なモデルを使用して作業するには時間がかかりすぎます。ベクトル化は助けになるかもしれませんが、私は明らかにベクトル化する方法を理解していません。どんな助けもありがとう。私はループからzを取り除き、モデルをベクトル化することを期待して、すべてのthetaを与えようとしましたが、エラーメッセージが表示されます。 – JasonK