Wybór modelu bayesowskiego w PyMC3

11

Używam PyMC3 do uruchamiania modeli bayesowskich na moich danych.

Jestem nowy w modelowaniu bayesowskim, ale według niektórych postów na blogach , Wikipedii i kontroli jakości z tej witryny wydaje się, że poprawnym podejściem jest zastosowanie współczynnika Bayesa i kryterium BIC, aby móc wybrać model najlepiej reprezentujący moje dane (ten, który generuje moje dane).

Aby obliczyć współczynnik Bayesa, potrzebuję względnego prawdopodobieństwa modeli, które chcę porównać. To może być dla mnie trochę mylące, ale myślę, że są dwa sposoby na uzyskanie prawdopodobieństwa (popraw mnie, jeśli się mylę):

  • algebraiczny sposób, gdy model jest prosty: patrz przykład Wikipedii strona czynnik Bayesa

  • sposób numeryczny: to właśnie robi PyMC3 z algorytmami MCMC

Jak mogę uzyskać dostęp do prawdopodobieństwa, a więc porównać moje modele w PyMC3? Znalazłem model.logpmetodę, która według doktora jest „logarytmiczną funkcją gęstości prawdopodobieństwa”. Czy mogę to wykorzystać, aby uzyskać prawdopodobieństwo?

Pytanie dodatkowe: gdy porównuje się dwa modele, oblicza się stosunek obu prawdopodobieństw. Co się stanie, jeśli chcesz porównać kilka modeli?

Konkretny przykład PyMC3 byłby bardzo pomocny!

hadim
źródło

Odpowiedzi:

15

Możesz obliczyć prawdopodobieństwo modelu za pomocą model.logp (). Jako dane wejściowe wymaga punktu. Na przykład model BEST z katalogu przykładów mogę zrobić:

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}))

Zauważ, że ten model używa transformowanych zmiennych, więc muszę je podać. Następnie możesz wziąć exp () tego i użyć go w integratorze numerycznym, na przykład podanym przez scipy.integrate. Problem polega na tym, że nawet przy 5 parametrach będzie to bardzo powolne.

Czynniki Bayesa są na ogół bardzo trudne do obliczenia, ponieważ trzeba zintegrować całą przestrzeń parametrów. Istnieje kilka pomysłów na wykorzystanie do tego próbek MCMC. Zobacz ten post, a zwłaszcza sekcję komentarzy, aby uzyskać więcej informacji: https://radfordneal.wordpress.com/2008/08/17/the-harmonic-mean-of-the-likelihood-worst-monte-carlo-method-ever / Przypadek BIC jest niestety podobny.

Jeśli naprawdę chcesz obliczyć współczynnik Bayesa, możesz także spojrzeć na test Savage'a Dickeya Ratio (patrz np. Http://drsmorey.org/bibtex/upload/Wagenmakers:etal:2010.pdf ), ale jego zastosowanie jest ograniczone.

Przypuszczam, że próbujesz dokonać porównania modelu, który jest polem z wieloma opiniami i rozwiązaniami (niektóre trudne do wdrożenia, takie jak BF). Jednym z bardzo łatwych do obliczenia mierników jest kryterium informacji dewiacyjnych. Ma to swoje wady, choć niektóre z nich można naprawić (patrz http://onlinelibrary.wiley.com/doi/10.1111/rssb.12062/abstract ). Niestety nie przenosiliśmy jeszcze kodu pymc3, ale byłoby to dość łatwe (zobacz tutaj implementację pymc2: https://github.com/pymc-devs/pymc/blob/895c24f62b9f5d786bce7ac4fe88edb4ad220364/pymc/MCMC.py# L410 ).

Kruschke preferuje podejście polegające na zbudowaniu pełnego modelu i poinformowaniu go, które parametry mają znaczenie. Można również wbudować wybór zmiennych w sam model (patrz np. Http://arxiv.org/pdf/math/0505633.pdf ).

Wreszcie, w celu uzyskania bardziej kompletnego leczenia, zobacz najnowszy post na blogu: http://jakevdp.github.io/blog/2015/08/07/frequentism-and-bayesianism-5-model-selection/

twiecki
źródło
1
Otwarty problem z dodawaniem DIC do pymc3: github.com/pymc-devs/pymc3/issues/797
twiecki