【发布时间】:2015-08-14 22:48:12
【问题描述】:
阅读 Cam Davidson-Pilon 的 Probabilistic Programming & Bayesian Methods for Hackers 后,我决定尝试使用 PyMC 解决隐马尔可夫模型 (HMM) 学习问题。到目前为止,代码不配合,但是通过排查,感觉已经缩小了问题的根源。
将代码分解成更小的块并专注于 t=0 时的初始概率和发射概率,我能够了解单个状态在 t=0 时的发射/观察参数。但是,一旦我添加另一个状态(总共两个状态),无论数据输入如何,参数学习的结果都是相同的(并且不正确)。所以,我觉得我一定在代码的@pm.deterministic 部分做错了,这不允许我从Init 初始概率函数中采样。
通过这部分代码,我的目标是学习对应于状态 0 和 1 的 初始概率 p_bern 和 发射概率 p_0 和 p_1 , 分别。发射取决于状态,这就是我试图用我的@pm.deterministic 函数来表达的。我可以在这个确定性函数中使用“if”语句吗?这似乎是问题的根源。
# This code is to test the ability to discern between two states with emissions
import numpy as np
import pymc as pm
from matplotlib import pyplot as plt
N = 1000
state = np.zeros(N)
data = np.zeros(shape=N)
# Generate data
for i in range(N):
state[i] = pm.rbernoulli(p=0.3)
for i in range(N):
if state[i]==0:
data[i] = pm.rbernoulli(p=0.4)
elif state[i]==1:
data[i] = pm.rbernoulli(p=0.8)
# Prior on probabilities
p_bern = pm.Uniform("p_S", 0., 1.)
p_0 = pm.Uniform("p_0", 0., 1.)
p_1 = pm.Uniform("p_1", 0., 1.)
Init = pm.Bernoulli("Init", p=p_bern) # Bernoulli node
@pm.deterministic
def p_T(Init=Init, p_0=p_0, p_1=p_1, p_bern=p_bern):
if Init==0:
return p_0
elif Init==1:
return p_1
obs = pm.Bernoulli("obs", p=p_T, value=data, observed=True)
model = pm.Model([obs, p_bern, p_0, p_1])
mcmc = pm.MCMC(model)
mcmc.sample(20000, 10000)
pm.Matplot.plot(mcmc)
我已经尝试以下方法无济于事:
- 对create a joint distribution 使用
@pm.potential装饰器 - 更改我的
Init位置的位置(您可以在代码中看到我的注释,我不确定该放在哪里) - 使用类似于this 的
@pm.stochastic
编辑:根据 Chris 的建议,我已将 Bernoulli 节点移到确定性之外。我还将代码更新为更简单的模型(伯努利观察而不是多项式),以便于排除故障。
感谢您的时间和关注。任何反馈都会受到热烈欢迎。另外,如果我遗漏任何信息,请告诉我!
【问题讨论】:
标签: python statistics pymc pymc3