2013-05-23 12 views
21

Jeśli pymc implementuje algorytm Metropolis-Hastings, aby wyprowadzić próbki z gęstości tylnej nad parametrami będącymi przedmiotem zainteresowania, wówczas aby zdecydować, czy przejść do następnego stanu w łańcuchu Markowa, musi być w stanie ocenić coś proporcjonalnego do gęstość tylna dla wszystkich podanych wartości parametrów.W jaki sposób pymc reprezentuje poprzednią funkcję rozkładu i prawdopodobieństwa?

Gęstość tylna jest proporcjonalna do funkcji prawdopodobieństwa na podstawie obserwowanych danych razy wcześniejszej gęstości.

W jaki sposób każdy z nich jest reprezentowany wewnątrz pymc? Jak obliczyć każdą z tych wielkości z obiektu modelu?

Zastanawiam się, czy ktoś może podać mi szczegółowy opis podejścia lub wskazać, gdzie mogę go znaleźć.

+0

Biorąc pod uwagę, że nikt nie wydaje się być w stanie odpowiedzieć, sugeruję tutaj: https://github.com/pymc-devs/pymc/issues – pablofiumara

+0

Wydaje się, że to praca dla [źródła] (https: //github.com/pymc-devs/pymc/blob/master/pymc/step_methods/metropolis.py#L47). Jest stosunkowo krótki i dzięki pozornemu zrozumieniu algorytmu, być może szybki wygląd będzie dla ciebie bardziej pouczający niż dla mnie. –

Odpowiedz

3

do reprezentowania przed, trzeba instancję Stochastic klasy, która ma dwa podstawowe atrybuty:

value : the variable's current value 
logp : the log probability of the variable's current value given the values of its parents 

można zainicjować przed nazwą dystrybucji używasz.

Aby reprezentować prawdopodobieństwo, potrzebujesz tak zwanego stochastycznego danych. Instancja klasy Stochastic, której flaga observed jest ustawiona na True. Wartości tej zmiennej nie można zmienić i nie będzie ona próbkowana. Ponownie, możesz zainicjować prawdopodobieństwo za pomocą nazwy dystrybucji, której używasz (ale nie zapomnij ustawić flagi observed na True).

że mamy następującą konfigurację:

import pymc as pm 
import numpy as np 
import theano.tensor as t 

x = np.array([1,2,3,4,5,6]) 
y = np.array([0,1,0,1,1,1]) 

Możemy uruchomić prostą regresji logistycznej z następujących czynności:

with pm.Model() as model: 
    #Priors 
    b0 = pm.Normal("b0", mu=0, tau=1e-6) 
    b1 = pm.Normal("b1", mu=0, tau=1e-6) 
    #Likelihood 
    z = b0 + b1 * x 
    yhat = pm.Bernoulli("yhat", 1/(1 + t.exp(-z)), observed=y) 
    # Sample from the posterior 
    trace = pm.sample(10000, pm.Metropolis()) 

Większość pochodziła z wyżej Chris Fonnesbeck za ipython notebooka here.

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. –

+0

Ben, mieszacie notację pymc2 i pymc3. "observed = true" było dla pymc2. Następnie trzeba było podać wartość w "wartości". pymc3 łączy te dwa słowa kluczowe, a dane są podawane bezpośrednio za pomocą słowa "observed = y", co oznacza (obserwowany = true). –

+0

co jeśli b0 jest wektorem, a wszystkie jego elementy są niezależne. tj. przeor może być napisany jako produkt gęstości? Jak to piszesz w Pymc? –

Powiązane problemy