I am not very much familiar with implementing probabilistic programming models. I have written a model in tensorflow probability and want to replicated similar behaviour using pyro. Following is the tensorflow probability model code
import tensorflow as tf
import tensorflow_probability as tfp
# DAG: Weather -> Happiness
def model1(weather_prob, weather_to_happiness_probs):
weather = yield tfp.distributions.JointDistributionCoroutine.Root(
tfp.distributions.Bernoulli(probs=weather_prob, name='weather')
)
happiness = yield tfp.distributions.Bernoulli(
probs=weather_to_happiness_probs[weather],
name='happiness'
)
theta_weather = tf.constant(0.8) # prob of weather being good
theta_happiness = tf.constant([0.7, 0.95])
joint_model1 = tfp.distributions.JointDistributionCoroutineAutoBatched(
lambda: model1(theta_weather, theta_happiness)
)
# generate data
dataset = joint_model1.sample(10)
# compute joint probability of the sample in the dataset
joint_model1.prob(dataset)
# compute likelihood of dataset: likelihood of data is individual probability of
# samples multiplied together
tf.reduce_prod(joint_model1.prob(dataset))
Here I have create a model weather to season probabilistic model and generated some sample from this model and trying to compute joint probability and likelihood of the dataset. Now, I want to repeat same exercise in pyro but I am not sure how to compute joint probability in pyro given a pryo model.
Primarily, Given a pyro model, I have two questions
(a) How to compute joint probability using model : is there any pyro methods available?
(b) How to compute individual/conditional probability given a pyro model?
Following is my attempt to create pyro model replicating the above model created in tensorflow probability
import torch
import pyro
import pyro.distributions as dist
def pyro_model1(weather_prob, weather_to_happiness_probs):
weather = pyro.sample("weather", dist.Bernoulli(probs=weather_prob))
happiness = pyro.sample("happiness", dist.Bernoulli(probs=weather_to_happiness_probs[weather.type(torch.int)]))
return weather, happiness
theta_weather = torch.tensor(0.8)
theta_happiness = torch.tensor([0.7, 0.95])
pyro.render_model(pyro_model1, model_args=(theta_weather, theta_happiness),
render_distributions=True, render_params=True,
render_deterministic=True)
# create a predictive model and sample data from it
predictive_model = pyro.infer.Predictive(pyro_model1, num_samples=10)
dataset = predictive_model(theta_weather, theta_happiness)
print(dataset)
# compute joint probability of the sample in the dataset
# TODO
# compute likelihood of dataset: likelihood of data is individual probability of
# TODO
Also the data type
weather sample was not int/torch.int
shouldn’t a sample from a Bernoulli
distribution be of type int
instead of float
? I needed to typecase to int
while writing the happiness sampling method (please see: weather.type(torch.int)
)