gmm_creation

This commit is contained in:
beiwang 2016-11-11 20:27:39 +00:00
commit 96901401cc
3 changed files with 76 additions and 0 deletions

View file

@ -58,11 +58,22 @@ class GmmNormalPrior(VariationalPrior):
self.link_parameter(self.variational_pi)
self.variational_pi.constrain_bounded(0.0, 1.0)
<<<<<<< HEAD
# self.stop = 5
=======
self.stop = 5
>>>>>>> a43d4b074832a791b7453c454f304eacd478c624
def KL_divergence(self, variational_posterior):
# Lagrange multiplier maybe also needed here
<<<<<<< HEAD
=======
# var_mean = np.square(variational_posterior.mean).sum()
# var_S = (variational_posterior.variance - np.log(variational_posterior.variance)).sum()
# return 0.5 * (var_mean + var_S) - 0.5 * variational_posterior.input_dim * variational_posterior.num_data
>>>>>>> a43d4b074832a791b7453c454f304eacd478c624
mu = variational_posterior.mean
S = variational_posterior.variance
pi = self.variational_pi
@ -77,11 +88,19 @@ class GmmNormalPrior(VariationalPrior):
return 0.5 * (cita[0] - (np.log(S)).sum() + cita[1]) + 0.5 * (cita[2] - total_n) + cita[3]
def update_gradients_KL(self, variational_posterior):
<<<<<<< HEAD
# import pdb; pdb.set_trace() # breakpoint 1
# print("Updating Gradients")
# if self.stop<1:
# return
# self.stop-=1
=======
import pdb; pdb.set_trace() # breakpoint 1
print("Updating Gradients")
if self.stop<1:
return
self.stop-=1
>>>>>>> a43d4b074832a791b7453c454f304eacd478c624
#dL:
#variational_posterior.mean.gradient -= variational_posterior.mean
#variational_posterior.variance.gradient -= (1. - (1. / (variational_posterior.variance))) * 0.5
@ -91,6 +110,7 @@ class GmmNormalPrior(VariationalPrior):
S = variational_posterior.variance
pi = self.variational_pi
<<<<<<< HEAD
cita_0 = np.zeros(mu.shape)
cita_1 = np.zeros(mu.shape)
cita_2 = np.zeros(mu.shape)
@ -108,6 +128,36 @@ class GmmNormalPrior(VariationalPrior):
variational_posterior.variance.gradient += (1. / (S) - cita_1) * 0.5
self.variational_pi.gradient +=cita_3
=======
cita_0 = np.zeros_like(mu)
cita_1 = np.zeros_like(mu)
cita_2 = np.zeros_like(mu)
cita_3 = np.zeros_like(pi)
for i in range(self.n_component):
print("About to change the gradient")
print pi.values[i]
print mu
print self.px_mu.values[i]
print self.px_var.values[i]
cita_0 += pi.values[i] * (mu - self.px_mu.values[i]) / self.px_var.values[i]
print "Has this helped?"
self.px_mu[i].gradient += pi[i] * (mu - self.px_mu[i]) / self.px_var[i]
cita_1 += (pi[i] / self.px_var[i])
cita_2 += pi[i] * (S + np.square(mu - self.px_mu[i])) / np.square(self.px_var[i])
self.px_var[i].gradient += (pi[i] * (S + np.square(mu - self.px_mu[i])) / np.square(self.px_var[i]) - (pi[i] / self.px_var[i])) * 0.5
cita_3[i] = (np.log(self.px_var[i]).sum()
+ (S / self.px_var[i]).sum()
+ (np.square(mu - self.px_mu[i]) / self.px_var[i]).sum() )* (-0.5) + np.log(self.pi[i] / pi[i]) - pi[i] * np.log(self.pi[i] / np.square(pi[i]))
self.variational_pi[i].gradient += cita_3[i]
variational_posterior.mean.gradient -= cita_0
variational_posterior.variance.gradient += (1. / (S) - cita_1) * 0.5
>>>>>>> a43d4b074832a791b7453c454f304eacd478c624
def check_weights(self, weights):
assert weights.min() >= 0.0
assert weights.max() <= 1.0
@ -117,6 +167,10 @@ class GmmNormalPrior(VariationalPrior):
self.check_weights(self.variational_pi)
self.check_weights(self.pi)
<<<<<<< HEAD
=======
>>>>>>> a43d4b074832a791b7453c454f304eacd478c624
class SpikeAndSlabPrior(VariationalPrior):
def __init__(self, pi=None, learnPi=False, variance = 1.0, group_spike=False, name='SpikeAndSlabPrior', **kw):
super(SpikeAndSlabPrior, self).__init__(name=name, **kw)

View file

@ -26,3 +26,4 @@ from .state_space_model import StateSpace
from .ibp_lfm import IBPLFM
from .gp_offset_regression import GPOffsetRegression
from .gp_grid_regression import GPRegressionGrid
from .gmm_bayesian_gplvm import GmmBayesianGPLVM

View file

@ -52,6 +52,7 @@ class GmmBayesianGPLVM(SparseGP_MPI):
if likelihood is None:
likelihood = Gaussian()
<<<<<<< HEAD
# Need to define what the model is initialised like
pi = np.ones(n_component) / float(n_component) # p(k)
@ -62,6 +63,26 @@ class GmmBayesianGPLVM(SparseGP_MPI):
px_mu[i] = np.zeros(X_variance.shape)
px_var[i] = np.ones(X_variance.shape)
=======
# Need to define what the model is initialised like
pi = np.ones(n_component) / float(n_component) # p(k)
variational_pi = pi.copy()
# px_mu = np.zeros(n_component)
# px_var = np.ones(n_component)
px_mu = [[]] * n_component
px_var = [[]] * n_component
for i in range(n_component):
px_mu[i] = np.zeros_like(X_variance)
px_var[i] = np.ones_like(X_variance)
# print("Should print")
# print(pi)
# print(px_mu)
# print(px_var)
# print(variational_pi)
# print("Didnt print")
>>>>>>> a43d4b074832a791b7453c454f304eacd478c624
self.variational_prior = GmmNormalPrior(px_mu=px_mu, px_var=px_var, pi=pi,
n_component=n_component, variational_pi=variational_pi)