Estimating probability of data point using inferred posterior

Hi everyone,

I apologize if this sounds like a beginner question, but I could not find the answer by Googling or searching this forum.

Let us assume that I have a model whose posterior I have inferred using some training data, how do I infer the probability of observing a particular live data point.

For example, consider the following simple probabilistic model:

bernoulli_model = pm.Model()
with bernoulli_model:
  p = pm.Normal('p', mu=0.5)
  obs = pm.Bernoulli('obs', p=p, observed=[0,1,1,1,1])

How do I calculate the probability of observing a 0 using this model?

Hmmm, I dont think there is a very easy way to do it. What I would do is to build a new observed RV and evaluate on the points from the trace:

with bernoulli_model:
    obs2 = pm.Bernoulli('obs2', p=p, observed=0) # input the new value 
                                                 # I would like to know the posterior prob

prob = np.exp(np.asarray([[obs2.logp(point) for point in straces]
                          for _, straces in trace._straces.items()]))

Thank you for the response.

As far as I understand this provides me an array with the possible values.
Do you know if it is possible to summarize this into a single value?

Computing the mean and you have an estimation of the expected probability.

After trying out the idea, it seems to work out fine.

However, unfortunately it seems to act very slowly (15 seconds) even when evaluating against 100 points for a simple linear regression model. Do you have an idea why this might be the case, and whether there is possibly a way to speed up?

Thanks again!

I think the problem is that evaluating obs2.logp is quite slow. Maybe it is better to rewrite it as a numpy function:

from scipy.stats import bernoulli
obs2 = 0
prob = np.asarray([[bernoulli.pmf(obs2, point['p']) for point in straces]
                          for _, straces in trace._straces.items()])

I will try that, thanks! :smile:

It seems that using numpy here works almost instantly :smile:.