Python PyMC:马尔可夫系统中的参数估计 一个简单的马尔可夫链

Python PyMC:马尔可夫系统中的参数估计 一个简单的马尔可夫链,python,hidden-markov-models,markov,pymc,Python,Hidden Markov Models,Markov,Pymc,假设我们想要估计一个系统的参数,这样我们就可以预测系统在时间步长t+1的状态,给定时间步长t的状态。PyMC应该能够轻松处理这一问题 让我们的玩具系统由一维世界中的一个运动物体组成。状态是对象的位置。我们要估计潜在变量,物体的速度。下一个状态取决于前一个状态和潜在变量速度 # define the system and the data true_vel = .2 true_pos = 0 true_positions = [.2 * step for step in range(100)]

假设我们想要估计一个系统的参数,这样我们就可以预测系统在时间步长t+1的状态,给定时间步长t的状态。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))

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

最简单的方法是生成一个列表,并允许PyMC将其作为容器处理。有一个相关的问题。以下是相关片段:

# 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)

注意,当前对数正态分布的平均值是最后一个对数正态分布的函数吗?不优雅,使用
列表。附加
和全部,但您可以使用列表理解来代替。

谢谢,它很有效。但是,使用列表理解不起作用,因为您无法轻松访问列表理解中最后添加的元素。我已经更新了我的玩具问题并加入了您的解决方案: