Hi,
The concept of blobs doesn’t seem to exist in PyMC3 (see https://emcee.readthedocs.io/en/latest/user/blobs).
Am I wrong? Would it be a reasonable feature request?
Thanks,
David.
Hi,
The concept of blobs doesn’t seem to exist in PyMC3 (see https://emcee.readthedocs.io/en/latest/user/blobs).
Am I wrong? Would it be a reasonable feature request?
Thanks,
David.
The only thing that vaguely resembles the blobs you linked above are the variational inference’s callbacks.
If you are interested in adding such a feature with a PR, you are more than welcome. My opinion is that you could maybe raise the feature request issue in pymc4’s repo, because it is still in a very early phase, so adding blobs might be easier there than in pymc3.
Depending on what you need access to, you should be able to do this with pm.Deterministic
. For example, the emcee
example for the eight schools model can be done like this:
import numpy as np
import pymc3 as pm
import theano.tensor as tt
J = 8
y = np.array([28., 8., -3., 7., -1., 1., 18., 12.])
sigma = np.array([15., 10., 16., 11., 9., 11., 10., 18.])
with pm.Model() as model:
mu = pm.Normal('mu', mu=0, sd=5)
tau = pm.HalfCauchy('tau', beta=5)
theta = pm.Normal('theta', mu=mu, sd=tau, shape=J)
obs = pm.Normal('obs', mu=theta, sd=sigma, observed=y)
logp = pm.Deterministic('logp', tt.sum([tt.sum(v.distribution.logp(v)) for v in model.vars]))
log_lik = pm.Deterministic('log_lik', tt.sum([tt.sum(v.distribution.logp(v)) for v in model.observed_RVs]))
trace = pm.sample()
We already gather the posterior log probability in sampler_stats
, and you can verify that they all match up:
(trace.get_sampler_stats('model_logp') - (trace['logp'] + trace['log_lik'])).max() # 0.0
Thanks, pm.Deterministic
seems to be the way to go indeed. I wanted something completely arbitrary returned with the log likelihood, like this:
import numpy as np
import pymc3 as pm
def gaussian(x, mu, sig):
return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.)))
def logp(x):
l1 = gaussian(x, -10, 1)
l2 = gaussian(x, 50, 10)
blob = 'my_blob'
return np.log(l1 + l2 / 50), blob
with pm.Model() as model:
X = pm.Uniform('X', lower=-100., upper=100., testval=0.)
lgp, blb = logp(X)
llk = pm.Potential('llk', lgp)
blob = pm.Deterministic('blob', blb)
But this fails with:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-59-563568a1bb76> in <module>
4 llk = pm.Potential('llk', lgp)
5
----> 6 blob = pm.Deterministic('blob', blb)
~/soft/miniconda3/lib/python3.7/site-packages/pymc3/model.py in Deterministic(name, var, model)
1431 """
1432 model = modelcontext(model)
-> 1433 var = var.copy(model.name_for(name))
1434 model.deterministics.append(var)
1435 model.add_random_variable(var)
AttributeError: 'str' object has no attribute 'copy'
Does blb
need to be wrapped into a special object?
Yikes. I believe it has to be a theano
tensor, and I do not know if there are string types.
You’re right, wrapping the blob with theano.tensor._shared(blob)
works (as long as the blob is a numerical NumPy array):
from theano.tensor import _shared
def logp(x):
l1 = gaussian(x, -10, 1)
l2 = gaussian(x, 50, 10)
blob = np.array([0, 1, 2])
return np.log(l1 + l2 / 50), _shared(blob)