# Change ed.KLqp to ed.sgld,then it gives error.why?

**URL:** <https://discourse.edwardlib.org/t/change-ed-klqp-to-ed-sgld-then-it-gives-error-why/954>\
**Category:** General\
**Created:** [October 16, 2018, 3:50am UTC](https://discourse.edwardlib.org/t/change-ed-klqp-to-ed-sgld-then-it-gives-error-why/954 "2018-10-16T03:50:40Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![liuchenbaidu](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.edwardlib.org/liuchenbaidu/32/355_2.png) [@liuchenbaidu](https://discourse.edwardlib.org/u/liuchenbaidu)\
**Post date:** [October 16, 2018, 3:50am UTC](https://discourse.edwardlib.org/t/change-ed-klqp-to-ed-sgld-then-it-gives-error-why/954/1 "2018-10-16T03:50:40Z")

</div>

from **future** import absolute\_import  
from **future** import division  
from **future** import print\_function

import edward as ed  
import matplotlib.pyplot as plt  
from matplotlib.patches import Ellipse  
import matplotlib.cm as cm  
import numpy as np  
import six  
import tensorflow as tf

from edward.models import (  
Categorical, Dirichlet, Empirical, InverseGamma,  
MultivariateNormalDiag, Normal, ParamMixture, Mixture)

plt.style.use(‘ggplot’)

pi = np.array([0.5, 0.5])  
mus = [[1, 1], [-1, -1]]  
stds = [[0.1, 0.1], [0.1, 0.1]]

def build\_toy\_dataset(N, pi=pi, mus=mus, stds=stds):  
x = np.zeros((N, 2), dtype=np.float32)  
for n in range(N):  
k = np.argmax(np.random.multinomial(1, pi))  
x[n, :] = np.random.multivariate\_normal(mus[k], np.diag(stds[k]))  
return x

N = 500 # number of data points  
K = 2 # number of components  
D = 2 # dimensionality of data  
ed.set\_seed(42)

x\_train = build\_toy\_dataset(N)  
x2\_train = 5.0\*x\_train

plt.scatter(x\_train[:, 0], x\_train[:, 1])  
plt.title(“Simulated dataset”)  
plt.show()

# The collapsed version marginalizes out the mixture assignments.

pi = Dirichlet(tf.ones(K))  
mu = Normal(tf.zeros(D), tf.ones(D), sample\_shape=K)  
sigmasq = InverseGamma(tf.ones(D), tf.ones(D), sample\_shape=K)  
cat = Categorical(probs=pi, sample\_shape=N)

components = [  
MultivariateNormalDiag(mu[k], sigmasq[k], sample\_shape=N)  
for k in range(K)]  
x = Mixture(cat=cat, components=components, sample\_shape=N)  
x2 = 5.0\*x

## KLqp

qmu = Normal(loc=tf.Variable(tf.random\_normal([K,D])),  
scale=tf.nn.softplus(tf.Variable(tf.random\_normal([K,D]))))

qsigmasq = InverseGamma(  
concentration=tf.nn.softplus(tf.Variable(tf.zeros([K,D]))),  
rate=tf.nn.softplus(tf.Variable(tf.zeros([K,D]))))

`Preformatted text`# inference = ed.KLqp({mu: qmu, sigmasq: qsigmasq}, data={x2: x2\_train})  
inference = ed.SGLD({mu: qmu, sigmasq: qsigmasq}, data={x2: x2\_train})

n\_iter = 10000  
n\_print = 500  
n\_samples = 30

inference.initialize(n\_iter=n\_iter, n\_print=n\_print, n\_samples=n\_samples)  
sess = ed.get\_session()  
init = tf.global\_variables\_initializer()  
init.run()

learning\_curve = []  
for \_ in range(inference.n\_iter):  
info\_dict = inference.update()  
if \_%1000 == 0:  
print(info\_dict)  
print(qmu.loc.eval())  
print(qmu.scale.eval())  
learning\_curve.append(info\_dict[‘loss’])

plt.semilogy(learning\_curve)  
plt.show()

TypeError: Posterior approximation must consist of only Empirical random variables.
