2015-09-18 29 views
8

In pymc3 come si configura un normale troncato prima? In pymc2 è piuttosto semplice (sotto), ma in pymc3 sembra che non ci sia più una distribuzione normale troncata disponibile.Come rendere normale un troncato: conversione di pymc2 in pymc3

Pymc2:

TruncatedNormal('gamma_own_%i_' % i, mu=go, tau=v_gamma_inv, value=0, a=-np.inf, b=0) 

Pymc3:?

risposta

11

In PyMC3 è possibile troncare qualsiasi distribuzione utilizzando Bound. prima devi costruire la distribuzione limitata (qui chiamato BoundedNormal), quindi creare una variabile in cui inserire i consueti parametri della distribuzione sottostante:

with pm.Model() as model: 
    BoundedNormal = pm.Bound(pm.Normal, lower=0, upper=1) 
    n = BoundedNormal('n', mu=0, tau=10) 
    tr = pm.sample(2000, pm.NUTS()) 

La distribuzione risultante aspetto: KDE and trace of the bounded normal distribution

+0

Grazie Kiudee! – Kemp

+1

Per le persone che lo trovano ora. Se ottieni un errore AttributeError: 'bool' non ha attributo 'any''. Quindi specifica un 'testval' nell'istanza' BoundedNormal'. – JudoWill

1

Il seguente codice funziona in Pymc3 versione 3.0

a, b=np.float32(0.0), np.float32(10.0) 

    K_lo, K_hi = 0.0, 1.0 

    BoundedNormal = pm.Bound(pm.Normal, lower=K_lo, upper=K_hi) 

    with pm.Model() as model: 

      n = BoundedNormal('n', mu=a, tau=b) 

      tr = pm.sample(2000, pm.NUTS()) 

      traceplot(tr)