Это является продолжением на PyMC: Parameter estimation in a Markov systemPyMC: иерархические Hidden Markov Model
У меня есть система, которая определяется его положением и скоростью на каждом временном шаге. Поведение системы определяется как:
vel = vel + damping * dt
pos = pos + vel * dt
Итак, вот моя модель PyMC. Для оценки vel
, pos
и, самое главное, damping
.
# PRIORS
damping = pm.Normal("damping", mu=-4, tau=(1/.5**2))
# we assume some system noise
tau_system_noise = (1/0.1**2)
# the state consist of (pos, vel); save in lists
# vel: we can't judge the initial velocity --> assume it's 0 with big std
vel_states = [pm.Normal("v0", mu=-4, tau=(1/2**2))]
# pos: the first pos is just the observation
pos_states = [pm.Normal("p0", mu=observations[0], tau=tau_system_noise)]
for i in range(1, len(observations)):
new_vel = pm.Normal("v" + str(i),
mu=vel_states[-1] + damping * dt,
tau=tau_system_noise)
vel_states.append(new_vel)
pos_states.append(
pm.Normal("s" + str(i),
mu=pos_states[-1] + new_vel * dt,
tau=tau_system_noise)
)
# we assume some observation noise
tau_observation_noise = (1/0.5**2)
obs = pm.Normal("obs", mu=pos_states, tau=tau_observation_noise, value=observations, observed=True)
Это, как я бегу выборки:
mcmc = pm.MCMC([damping, obs, vel_states, pos_states])
mcmc.sample(50000, 25000)
pm.Matplot.plot(mcmc.get_node("damping"))
damping_samples = mcmc.trace("damping")[:]
print "damping -- mean:%f; std:%f" % (mean(damping_samples), std(damping_samples))
print "real damping -- %f" % true_damping
Значение damping
доминирует настоятелем. Даже если я изменю до Униформы или что-то еще, это все еще так.
Что я делаю неправильно? Это похоже на предыдущий пример, только с другим слоем.
Полный IPython ноутбук этой проблемы можно найти здесь: http://nbviewer.ipython.org/github/sotte/random_stuff/blob/master/PyMC%20-%20HMM%20Dynamic%20System.ipynb
[EDIT:. Некоторые пояснения & кода для отбора проб]
[EDIT2: @ Крис ответ не помог. Я не мог использовать AdaptiveMetropolis
, так как * _states не являются частью модели.]
Я перезапустил вашу записную книжку, и я вижу, как pymc ведет себя правильно. то есть иначе, чем вы опубликовали. Теперь ваша первая реализация отлично работает. Возможно, что-то было исправлено с 2013 года! – shpigi