2013-05-23 98 views
21

Se pymc implementa l'algoritmo di Metropolis-Hastings per ottenere campioni dalla densità posteriore rispetto ai parametri di interesse, quindi per decidere se passare allo stato successivo nella catena markov deve essere in grado di valutare qualcosa di proporzionale a la densità posteriore per tutti i valori dei parametri dati.In che modo pymc rappresenta la funzione di distribuzione e probabilità precedente?

La densità posteriore è proporzionale alla funzione di probabilità basata sui dati osservati moltiplicati per la densità precedente.

Come sono rappresentati ciascuno di questi all'interno di pymc? Come calcola ciascuna di queste quantità dall'oggetto del modello?

Mi chiedo se qualcuno può darmi una descrizione di alto livello dell'approccio o indicarmi dove posso trovarlo.

+0

Tenendo conto che nessuno sembra essere in grado di risponderti, ti suggerisco di chiedere qui: https://github.com/pymc-devs/pymc/issues – pablofiumara

+0

Questo sembra un lavoro per [l'origine] (https: //github.com/pymc-devs/pymc/blob/master/pymc/step_methods/metropolis.py#L47). È relativamente breve, e con la tua comprensione apparente dell'algoritmo, forse un rapido sguardo sarà più illuminante per te di quanto non fosse per me. –

risposta

3

per rappresentare la prima, è necessario un istanza della classe stocastico, che ha due attributi primari:

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

è possibile inizializzare una prima con il nome della distribuzione che si sta utilizzando.

Per rappresentare la probabilità, è necessario un cosiddetto Data stocastico. Ovvero, un'istanza di classe Stochastic il cui flag observed è impostato su True. Il valore di questa variabile non può essere modificato e non verrà campionato. Anche in questo caso, è possibile inizializzare la probabilità con il nome della distribuzione in uso (ma non dimenticare di impostare il flag observed su True).

Supponiamo di avere la seguente configurazione:

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

Possiamo eseguire una semplice regressione logistica con il seguente:

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

La maggior parte di quanto sopra è venuto da ipython notebook di Chris Fonnesbeck here.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. –

+0

Ben, stai mixando la notazione pymc2 e pymc3. 'osservato = true' era per pymc2. Quindi si doveva dare il valore in 'valore'. pymc3 unisce queste due parole chiave ei dati sono dati direttamente con 'osservato = y', che implica (osservato = vero). –

+0

cosa succede se b0 è un vettore e tutti i suoi elementi sono indipendenti. cioè il priore può essere scritto come prodotto di densità? Come scrivi questo in Pymc? –