Выбор байесовской модели в PyMC3

11

Я использую PyMC3 для запуска байесовских моделей на моих данных.

Я новичок в байесовском моделировании, но, согласно сообщениям в некоторых блогах , Википедии и QA с этого сайта, кажется правильным подход использовать фактор Байеса и критерий BIC, чтобы иметь возможность выбрать, какая модель лучше всего представляет мои данные (та, которая генерирует мои данные).

Чтобы вычислить коэффициент Байеса, мне нужна относительная вероятность для моделей, которые я хочу сравнить. Возможно, это немного смущает меня, но я думаю, что есть два способа получить вероятность (поправьте меня, если я ошибаюсь):

  • алгебраический способ, когда модель проста: см. страницу примера Байеса в Википедии

  • числовой способ: это то, что делает PyMC3 с алгоритмами MCMC

Как я могу получить доступ к вероятности и сравнить мои модели в PyMC3? Я нашел model.logpметод, который в соответствии с документом является «функция плотности вероятности журнала». Могу ли я использовать это, чтобы получить вероятность?

Бонусный вопрос: при сравнении двух моделей вычисляется соотношение между обеими вероятностями. Что произойдет, если вы захотите сравнить несколько моделей?

Конкретный пример PyMC3 был бы очень полезен!

Хадим
источник

Ответы:

15

Вы можете вычислить вероятность модели действительно с помощью model.logp (). В качестве входных данных требуется точка. Например, лучшая модель из каталога примеров, которую я могу сделать:

np.exp(model.logp({'group1_mean': 0.1, 
                   'group2_mean': 0.2, 
                   'group1_std_interval': 1., 
                   'group2_std_interval': 1.2, 
                   'nu_minus_one_log': 1}))

Обратите внимание, что эта модель использует преобразованные переменные, поэтому я должен предоставить их. Затем вы можете взять exp () этого и использовать его внутри числового интегратора, например, как предусмотрено scipy.integrate. Проблема в том, что даже с 5 параметрами это будет очень медленно.

Факторы Байеса, как правило, очень трудно вычислить, потому что вы должны интегрировать все пространство параметров. Для этого есть несколько идей по использованию образцов MCMC. См. Этот пост и особенно раздел комментариев для получения дополнительной информации: https://radfordneal.wordpress.com/2008/08/17/the-harmonic-mean-of-the-likelihood-worst-monte-carlo-method-ever / Дело в БИК, к сожалению, похоже.

Если вы действительно хотите вычислить коэффициент Байеса, вы также можете посмотреть на тест Savage Dickey Ratio (см., Например, http://drsmorey.org/bibtex/upload/Wagenmakers:etal:2010.pdf ), но его применение ограничено.

Я полагаю, что вы пытаетесь провести сравнение моделей, которое является областью со многими мнениями и решениями (некоторые трудно реализуемы, например, BF). Одним из показателей, который очень легко вычислить, является информационный критерий отклонения. У него есть свои недостатки, хотя некоторые из них можно исправить (см. Http://onlinelibrary.wiley.com/doi/10.1111/rssb.12062/abstract ). К сожалению, мы еще не портировали код pymc3, но это было бы довольно просто (см. Здесь для реализации pymc2: https://github.com/pymc-devs/pymc/blob/895c24f62b9f5d786bce7ac4fe88edb4ad220364/pymc/MCMC.py# L410 ).

Крушке предпочитает подход, состоящий в том, чтобы просто построить полную модель и позволить ей сказать, какие параметры имеют значение. Вы также можете встроить выбор переменных в саму модель (см., Например, http://arxiv.org/pdf/math/0505633.pdf ).

Наконец, для более полного рассмотрения см. Это недавнее сообщение в блоге: http://jakevdp.github.io/blog/2015/08/07/frequentism-and-bayesianism-5-model-selection/

twiecki
источник
1
Открыта проблема для добавления DIC в pymc3: github.com/pymc-devs/pymc3/issues/797
twiecki