MAP в PyMC выдает непредвиденную ошибку

Я не понимаю, почему MAP выдает ошибку, тогда как MCMC работает нормально в том же сценарии? Я пишу ниже соответствующую часть кода.

tau = Uniform('tau', lower=0.01, upper=5, doc='tau') rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed =True) for i in xrange(0, len(count)) ] M = MAP([rv, tau]) M.fit() tau_hat = M.tau.value()

Ошибка: AttributeError: объект 'MAP' не имеет атрибута 'tau' (для последней строки M.tau.value())

С другой стороны, если я использую MCMC вместо MAP, все работает нормально:

m = MCMC([tau, rv]) m.sample(iter = 500) print m.trace('tau')

Мне нужна точечная оценка тау, при которой апостериорная вероятность имеет максимальную вероятность, и сравнить ее с байесовским прогнозом (для которого я использую MCMC)

Немного информации о переменных:

prob_distribution — это детерминированная функция, которая с учетом tau и некоторой другой информации возвращает список прогнозируемых распределений вероятностей для каждой игры. У меня около 200 игр, поэтому prob_distribution — это список из 200 списков (каждый из которых содержит распределение вероятностей по действиям для этой игры, например [0.4, 0.4, 0.2]). Точно так же count — это список из 200 чисел, count[i] обозначает количество раз, когда была сыграна ith игра. data[i] — это наблюдаемая информация для игры ith, например, если data[i] = [10 10 6], count[i] будет 26

Дополнительное примечание

Если я включу следующую строку:

model = Model([rv, tau])

то независимо от того, использую ли я

M = MAP(model) or m = MCMC(model)

это дает ошибку следующим образом:

TypeError: hasattr(): имя атрибута должно быть строкой

Может кто-нибудь объяснить, что происходит?


person turing    schedule 05.06.2014    source источник


Ответы (1)


В PyMC2 объект MCMC предоставляет узлы модели как переменные экземпляра, а объект MAP — нет. Возможно, стоит отправить запрос функции в pymc-devs. Вы можете получить значение MAP тау, заменив последнюю строку на

tau_hat = tau.value

Полный, минимальный пример этого обходного пути:

from pymc import *

count = [10, 10]
prob_distribution = [[.5, .5], [.1, .2, .7]]
data = [[2, 8], [2, 3, 5]]

tau = Uniform('tau', lower=0.01, upper=5)
rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in xrange(0, len(count)) ]
M = MAP([rv, tau])
M.fit()
tau_hat = tau.value

Обратите внимание, что tau не информируется о данных в этой модели, как написано...

person Abraham D Flaxman    schedule 05.06.2014
comment
Я хочу, чтобы тау имел такое значение, которое максимизирует его апостериорную вероятность, и поэтому я использую MAP, но в вашем коде, если я напечатаю значение тау до и после использования MAP, оно не изменится. Если это невозможно сделать с помощью MAP, есть ли другой способ сделать это ?? - person turing; 05.06.2014
comment
Это проблема с построенной вами моделью, а не с оптимизацией MAP. - person Abraham D Flaxman; 09.06.2014
comment
Можете ли вы предложить любую лучшую модель, в которой я могу использовать оптимизацию MAP? Agai, пожалуйста, приведите небольшой рабочий пример, спасибо - person turing; 09.06.2014
comment
К сожалению, я понятия не имею, что вы пытаетесь смоделировать, поэтому никаких предложений относительно того, что вы должны изменить. Удачи! - person Abraham D Flaxman; 11.06.2014