Looking for use of Empirical class to create an empirical distribution from samples


#1

Can someone point me to an example of creating in instance of the Empirical distribution from samples and log_weights? I wrote an ABC method for inferring a latent variable that is hard to infer using standard Pyro solvers. I want to sample my latent from that empirical distribution in a new program.

Related post: Is there any example on how to use/create an empirical distribution?


#2

Small illustration is below, but you might find the tests in test_empirical useful. I’m not sure if you will be able to use this distribution freely inside of SVI though. In particular, it won’t work inside plates, since it lacks a .expand method and the log_prob method cannot score batched samples. Currently, this is only being used to hold the results of inference.

>>> import torch
>>> from pyro.distributions import Empirical
>>> samples = torch.randn(10, 3, 5)  
>>> weights = torch.rand(10).log()  # samples aggregated along the leftmost dim
>>> emp = Empirical(samples, weights)
>>> emp.batch_shape
torch.Size([])
>>> emp.event_shape
torch.Size([3, 5])
>>> emp.sample()  # shape([3, 5])
tensor([[ 2.5262,  0.2761,  0.7590, -1.2264,  1.7800],
        [ 0.3883,  2.0159, -0.1476, -0.0484,  0.8950],
        [ 0.6351, -1.5402, -0.2153, -1.7630, -2.9152]])
>>> emp.log_prob(emp.sample()) # shape([]) 
tensor(-2.6976)