我试图弄清楚如何正确地制作离散状态马尔可夫链模型pymc
。
作为一个例子(在nbviewer中查看),让我们制作一个长度为 T=10 的链,其中马尔可夫状态是二进制的,初始状态分布是 [0.2, 0.8] 并且在状态 1 中切换状态的概率是 0.01 2 它是 0.5
import numpy as np
import pymc as pm
T = 10
prior0 = [0.2, 0.8]
transMat = [[0.99, 0.01], [0.5, 0.5]]
为了制作模型,我制作了一个状态变量数组和一个依赖于状态变量的转换概率数组(使用 pymc.Index 函数)
states = np.empty(T, dtype=object)
states[0] = pm.Categorical('state_0', prior0)
transPs = np.empty(T, dtype=object)
transPs[0] = pm.Index('trans_0', transMat, states[0])
for i in range(1, T):
states[i] = pm.Categorical('state_%i' % i, transPs[i-1])
transPs[i] = pm.Index('trans_%i' %i, transMat, states[i])
对模型进行采样表明状态边际是它们应该是的(与在 Matlab 中使用 Kevin Murphy 的 BNT 包构建的模型相比)
model = pm.MCMC([states, transPs])
model.sample(10000, 5000)
[np.mean(model.trace('state_%i' %i)[:]) for i in range(T)]
打印出来:
[-----------------100%-----------------] 10000 of 10000 complete in 7.5 sec
[0.80020000000000002,
0.39839999999999998,
0.20319999999999999,
0.1118,
0.064199999999999993,
0.044600000000000001,
0.033000000000000002,
0.026200000000000001,
0.024199999999999999,
0.023800000000000002]
我的问题是——这似乎不是用 pymc 构建马尔可夫链的最优雅的方式。是否有一种不需要确定性函数数组的更简洁的方法?
我的目标是为更通用的动态贝叶斯网络编写一个基于 pymc 的包。