It is straightforward to do the following and wrap a Gaussian into an Independent
. So if we are given a
loc = [batch_size, event_shape]
scale = [batch_size]
loc = torch.zeros(5, 3, 2)
scale = torch.ones(2)
normal = Normal(loc, scale)
normal.batch_shape, normal.event_shape
(torch.Size([5, 3, 2]), torch.Size([]))
ind = Independent(normal, 1)
ind.batch_shape, ind.event_shape
(torch.Size([5, 3]), torch.Size([2]))
This Independent
distribution is identical to a MultivariateNormal
defined as:
mvn = MultivariateNormal(mu, torch.diag(scale))
But, what if I have the following:
mu = torch.zeros(5, 2)
log_sigma = torch.ones(5, 2)
Independent(Normal(loc=mu, scale=torch.exp(log_sigma)), 1)
This works fine, however how to use MultivariateNormal is not clear:
mvn = MultivariateNormal(mu, ???)
Is it possible to use MultivariateNormal
and get the same distribution? How do I provide the covariance_matrix
argument given log_sigma
of shape [batch_size, event_shape]
EDIT:
mu = torch.zeros(5, 2)
log_sigma = torch.ones(5, 2)
cov = torch.stack([torch.diag(sigma) for sigma in torch.exp(log_sigma)])
mvn = MultivariateNormal(mu, cov)
=> would this result in an equivalent to
Independent(Normal(loc=mu, scale=torch.exp(log_sigma)), 1)
??