3 # Any copyright is dedicated to the Public Domain.
4 # https://creativecommons.org/publicdomain/zero/1.0/
6 # Written by Francois Fleuret <francois@fleuret.org>
11 return - p @ (q / p).log()
13 # p(X = x, Z = z) = p[x, z]
17 q = torch.rand(p.size())
22 p_X_given_Z = p / p.sum(0, keepdim = True)
23 p_Z_given_X = p / p.sum(1, keepdim = True)
24 q_X_given_Z = q / q.sum(0, keepdim = True)
25 q_Z_given_X = q / q.sum(1, keepdim = True)
27 for x in range(p.size(0)):
28 elbo = q_Z_given_X[x, :] @ ( p_X_given_Z[x, :] / q_Z_given_X[x, :] * p_Z).log()
29 print(p_X[x].log(), elbo + D_KL(q_Z_given_X[x, :], p_Z_given_X[x, :]))