2013-11-26 5 views
3

Простой 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)) 

Однако индекс представляется массивом, который не подходит для индексирования. Вероятно, есть лучший способ получить доступ к предыдущему состоянию.

ответ

2

Самый простой способ - создать список и разрешить PyMC иметь дело с ним как с контейнером. Существует соответствующий 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) 

Обратите внимание, как среднее значение тока Логнормального является функцией последнего? Не изящно, используя list.append и все, но вместо этого вы можете использовать понимание списка.

+0

Спасибо, это работает. Использование списков не работает, потому что вы не можете легко получить доступ к последнему добавленному элементу в понимании списка. Я обновил игрушку и включил ваше решение: http://nbviewer.ipython.org/github/sotte/random_stuff/blob/master/PyMC%20-%20Simple%20Markov%20Chain.ipynb – Stefan

 Смежные вопросы

  • Нет связанных вопросов^_^