PyMC:马尔可夫系统中的参数估计

时间:2013-11-26 16:45:43

标签: python hidden-markov-models markov pymc

简单的Markow链

假设我们想要估计系统的参数,以便我们可以在时间步长t + 1时预测系统的状态。 PyMC应该能够轻松应对这一点。

让我们的玩具系统由一维世界中的移动物体组成。状态是对象的位置。我们想要估计潜在变量/对象的速度。下一个状态取决于先前的状态,潜在的变量取决于速度。

# define the system and the data
true_vel = .2
true_pos = 0
true_positions = [.2 * step for step in range(100)]

我们假设我们的观察中有一些噪音(但这并不重要)。

问题是:如何模拟下一个状态对当前状态的依赖性。我可以为转换函数提供参数idx以在时间t访问位置,然后在时间t + 1预测位置。

vel = pymc.Normal("pos", 0, 1/(.5**2))
idx = pymc.DiscreteUniform("idx", 0, 100, value=range(100), observed=True)

@pm.deterministic
def transition(positions=true_positions, vel=vel, idx=idx):
    return positions[idx] + vel

# observation with gaussian noise
obs = pymc.Normal("obs", mu=transition, tau=1/(.5**2))

但是,索引似乎是一个不适合索引的数组。可能有更好的方式来访问以前的状态。

1 个答案:

答案 0 :(得分:3)

最简单的方法是生成一个列表,并允许PyMC将其作为Container处理。有一个相关的example on the PyMC wiki。以下是相关摘录:

# Lognormal distribution of P's
Pmean0 = 0.
P_0 = Lognormal('P_0', mu=Pmean0, tau=isigma2, trace=False, value=P_inits[0])
P = [P_0]

# Recursive step
for i in range(1,nyears):
    Pmean = Lambda("Pmean", lambda P=P[i-1], k=k, r=r: log(max(P+r*P*(1-P)-k*catch[i-1],0.01)))
    Pi = Lognormal('P_%i'%i, mu=Pmean, tau=isigma2, value=P_inits[i], trace=False)
    P.append(Pi)

请注意当前Lognormal的平均值是否与最后一个函数相同?不是很优雅,使用list.append和所有,但你可以使用列表理解。