Простой Markow Chain
Допустим, мы хотим оценить параметры системы таким образом, что мы можем предсказать состояние системы в Timestep т + 1, учитывая состояние при Timestep т , PyMC должен иметь возможность справиться с этим легко.PyMC: Оценка параметров в системе Маркова
Пусть наша игрушечная система состоит из движущегося объекта в мире 1D. Состояние - это позиция объекта. Мы хотим оценить скрытую переменную/скорость объекта. Следующее состояние зависит от предыдущего состояния и скрытой переменной скорости.
# 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))
Однако индекс представляется массивом, который не подходит для индексирования. Вероятно, есть лучший способ получить доступ к предыдущему состоянию.
Спасибо, это работает. Использование списков не работает, потому что вы не можете легко получить доступ к последнему добавленному элементу в понимании списка. Я обновил игрушку и включил ваше решение: http://nbviewer.ipython.org/github/sotte/random_stuff/blob/master/PyMC%20-%20Simple%20Markov%20Chain.ipynb – Stefan