From 0e13be48f19aae990154a768034be93ed4333c8d Mon Sep 17 00:00:00 2001 From: Zhenwen Dai Date: Tue, 25 Feb 2014 16:09:26 +0000 Subject: [PATCH] [SSGPLVM] migrate SSGPLVM to params branch --- GPy/core/parameterization/variational.py | 37 +++++++++++++++++++++--- GPy/kern/__init__.py | 1 + GPy/models/__init__.py | 1 + 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/GPy/core/parameterization/variational.py b/GPy/core/parameterization/variational.py index ef4d974d..c51a8021 100644 --- a/GPy/core/parameterization/variational.py +++ b/GPy/core/parameterization/variational.py @@ -9,7 +9,10 @@ from parameterized import Parameterized from param import Param from transformations import Logexp -class VariationalPrior(object): +class VariationalPrior(Parameterized): + def __init__(self, name=None, **kw): + super(VariationalPrior, self).__init__(name=name, **kw) + def KL_divergence(self, variational_posterior): raise NotImplementedError, "override this for variational inference of latent space" @@ -19,7 +22,7 @@ class VariationalPrior(object): """ raise NotImplementedError, "override this for variational inference of latent space" -class NormalPrior(VariationalPrior): +class NormalPrior(VariationalPrior): def KL_divergence(self, variational_posterior): var_mean = np.square(variational_posterior.mean).sum() var_S = (variational_posterior.variance - np.log(variational_posterior.variance)).sum() @@ -30,6 +33,32 @@ class NormalPrior(VariationalPrior): variational_posterior.mean.gradient -= variational_posterior.mean variational_posterior.variance.gradient -= (1. - (1. / (variational_posterior.variance))) * 0.5 +class SpikeAndSlabPrior(VariationalPrior): + def __init__(self, variance = 1.0, pi = 0.5, name='SpikeAndSlabPrior', **kw): + super(VariationalPrior, self).__init__(name=name, **kw) + assert variance==1.0, "Not Implemented!" + self.pi = Param('pi', pi) + self.variance = Param('variance',variance) + self.add_parameters(self.pi, self.variance) + + def KL_divergence(self, variational_posterior): + mu = variational_posterior.mean + S = variational_posterior.variance + gamma = variational_posterior.binary_prob + var_mean = np.square(mu) + var_S = (S - np.log(S)) + var_gamma = (gamma*np.log(gamma/self.pi)).sum()+((1-gamma)*np.log((1-gamma)/(1-self.pi))).sum() + return var_gamma+ 0.5 * (gamma* (var_mean + var_S -1)).sum() + + def update_gradients_KL(self, variational_posterior): + mu = variational_posterior.mean + S = variational_posterior.variance + gamma = variational_posterior.binary_prob + + gamma.gradient -= np.log((1-self.pi)/self.pi*gamma/(1.-gamma))+(np.square(mu)+S-np.log(S)-1.)/2. + mu.gradient -= gamma*mu + S.gradient -= (1. - (1. / (S))) * gamma /2. + class VariationalPosterior(Parameterized): def __init__(self, means=None, variances=None, name=None, **kw): @@ -65,7 +94,7 @@ class NormalPosterior(VariationalPosterior): from ...plotting.matplot_dep import variational_plots return variational_plots.plot(self,*args) -class SpikeAndSlab(VariationalPosterior): +class SpikeAndSlabPosterior(VariationalPosterior): ''' The SpikeAndSlab distribution for variational approximations. ''' @@ -73,7 +102,7 @@ class SpikeAndSlab(VariationalPosterior): """ binary_prob : the probability of the distribution on the slab part. """ - super(SpikeAndSlab, self).__init__(means, variances, name) + super(SpikeAndSlabPosterior, self).__init__(means, variances, name) self.gamma = Param("binary_prob",binary_prob,) self.add_parameter(self.gamma) diff --git a/GPy/kern/__init__.py b/GPy/kern/__init__.py index a1f57619..ea558c7c 100644 --- a/GPy/kern/__init__.py +++ b/GPy/kern/__init__.py @@ -7,6 +7,7 @@ from _src.stationary import Exponential, Matern32, Matern52, ExpQuad, RatQuad, C from _src.mlp import MLP from _src.periodic import PeriodicExponential, PeriodicMatern32, PeriodicMatern52 from _src.independent_outputs import IndependentOutputs +from _src.ssrbf import SSRBF #import coregionalize #import eq_ode1 #import finite_dimensional diff --git a/GPy/models/__init__.py b/GPy/models/__init__.py index 3fcaffa8..83db4b8c 100644 --- a/GPy/models/__init__.py +++ b/GPy/models/__init__.py @@ -15,3 +15,4 @@ from mrd import MRD from gradient_checker import GradientChecker from gp_multioutput_regression import GPMultioutputRegression from sparse_gp_multioutput_regression import SparseGPMultioutputRegression +from ss_gplvm import SSGPLVM \ No newline at end of file