2014-02-25 10 views

Antwort

4

Dies ist eine schwierige Port und erfordert drei neue Konzepte:

  1. Verwendung des theano Tensor
  2. Verwendung des DensityDist
  3. eine dict als observed

Dieser Code Passing stellt das entsprechende Modell als PyMC2-Version zur Verfügung, die Sie oben verlinkt haben:

import pymc3 as pm 
from pymc.examples import melanoma_data as data 
import theano.tensor as t 

times = data.t # not to be confused with the theano tensor t! 
failure = (data.censored==0).astype(int) 

with pm.Model() as model: 

    beta0 = pm.Normal('beta0', mu=0.0, tau=0.0001) 
    beta1 = pm.Normal('beta1', mu=0.0, tau=0.0001) 
    lam = t.exp(beta0 + beta1*data.treat) 

    def survival_like(failure, value): 
     return t.sum(failure * t.log(lam) - lam * value) 

    survive = pm.DensityDist('survive', survival_like, 
         observed={'failure': failure, 'value': times}) 

with model: 

    start = pm.find_MAP() 
    step = pm.NUTS(scaling=start) 
    trace = pm.sample(10000, step=step, start=start) 

pm.traceplot(trace); 

Ausgabe wie folgt:

enter image description here

+0

Wenn 'beobachtet passing = {...}', wie sind die Argumente 'survival_like' geben? Müssen die Argumente in alphabetischer Reihenfolge sein? Vielen Dank! –

+0

Ich glaube nicht, dass es wichtig ist. Aber Sie könnten einen einfachen Test zur Bestätigung durchführen. – inversion

+0

Danke! Ich konnte in die PyMC-Codebasis eintauchen, um zu sehen, dass "logp" mit "** data" aufgerufen wird, so dass die Werte aus dem dict unabhängig von der Reihenfolge an das richtige Argument übergeben werden. https://github.com/pymc-devs/pymc3/blob/master/pymc3/model.py#L535 –