Changing the likelihood in mixture_gaussian_mh.py example


#1

Dear Edward users,

It is my intention to do inference in a mixture of different distributions, K Gaussians and one Uniform, in 3D.

So, first of all, I’ve tried to reproduce the examples which have some similarities with my problem. I’ve reproduced successfully the mixutre_gaussian_mh.py example within Github repository. But, I wonder why changing line 53

x = Normal(loc=tf.gather(mu, c), scale=tf.gather(sigma, c))

by

components = [
    MultivariateNormalDiag(tf.ones([N,1])*mu[k], tf.ones([N,1])*sigma[k])
    for k in range(K)]
x = Mixture(cat=c, components=components)

Which I think is more convenient to define my problem, Inference does not initialize. Please, any help will be welcome!

>>> inference.initialize()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/angel/src/edward/edward/inferences/monte_carlo.py", line 98, in initialize
    self.train = self.build_update()
  File "/home/angel/src/edward/edward/inferences/metropolis_hastings.py", line 127, in build_update
    x_znew = copy(x, dict_swap_new, scope=scope_new)
  File "/home/angel/src/edward/edward/util/random_variables.py", line 232, in copy
    new_rv = type(rv)(*args, **kwargs)
  File "/home/angel/src/edward/edward/models/random_variable.py", line 95, in __init__
    super(RandomVariable, self).__init__(*args, **kwargs)
  File "/home/angel/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/contrib/distributions/python/ops/mixture.py", line 94, in __init__
    cat)
TypeError: cat must be a Categorical distribution, but saw: Tensor("inference_139892168415760/old/Categorical_1/sample/Reshape_1:0", shape=(500,), dtype=int32)

#2

Mixture represents a mixture distribution that collapses out the categorical, p(x) = \sum_{k=1}^K p(c = k) p(x | c = k). If you aim to use this collapsed version, then you don’t need to infer c in inference.

Specifically, using your proposed change along with

inference = ed.MetropolisHastings(
    latent_vars={pi: qpi, mu: qmu, sigma: qsigma},
    proposal_vars={pi: gpi, mu: gmu, sigma: gsigma},
    data={x: x_data})

succeeds.

It would be nice to raise a more informative error message for this.