PyMC3でおもちゃのディスクリートHMMモデルを使用していますが、いくつかの問題があります。PyMC3で離散HMMを構築する際の問題
このような私の最初のコードを見て:
# Known transition and emission
with pymc3.Model() as hmm1:
T = tt.as_tensor_variable(Tr)
E = tt.as_tensor_variable(Er)
# State models
p0 = np.ones(num_states)/num_states
# No shape, so each state is a scalar tensor
states = [pymc3.Categorical('s0', p=p0)]
emissions = [pymc3.Categorical('z0', p=E[:,states[0]], observed=Zr[:,0])]
for i in range(1, num_times):
states.append(pymc3.Categorical('s{0}'.format(i), p=T[:,states[i-1]]))
emissions.append(pymc3.Categorical('z{0}'.format(i), p=E[:,states[i]], observed=Zr[:,i]))
ここ
Tr
とEr
は本当の推移と排出量行列です。
私の問題は、次のとおりです。
このモデルは、状態の完全な値を探索するようではありません、それは各状態のための単一の値にとどまる(ノートを参照してください)。
states
とemissions
をより厳密に定義する方法が見つかりませんでした。shape=...
を使用してください。さらに私は、遷移または放出マトリックス不明を説明するためにモデルを拡張するとき、私は、インデックスの問題に走った、と私は次のコードのように、
theano.tensor.clip
を使用するように強制しています:# Unknown transitions and emissions with pymc3.Model() as hmm3: # Transition "matrix" a_t = np.ones((num_states,num_states)) T = pymc3.Dirichlet('T', a=a_t, shape=(num_states,num_states)) # Emission "matrix" a_e = np.ones((num_emissions, num_states)) E = pymc3.Dirichlet('E', a=a_e, shape=(num_emissions, num_states)) # State models p0 = np.ones(num_states)/num_states # No shape, so each state is a scalar tensor states = [pymc3.Categorical('s0', p=p0)] clp_state = tt.clip(states[0], 0, num_states-1) emissions = [pymc3.Categorical('z0', p=E[:,clp_state], observed=Zr[0])] for i in range(1, num_times): clp_prev_state = tt.clip(states[i-1], 0, num_states-1) states.append(pymc3.Categorical('s{0}'.format(i), p=T[:,clp_prev_state])) clp_state = tt.clip(states[i], 0, num_states-1) emissions.append(pymc3.Categorical('z{0}'.format(i), p=E[:,clp_state], observed=Zr[i]))
notebook with a complete codeを参照してください。 (あるいは、それ以上のtheanoウェイ)