diff --git a/GPy/core/gp.py b/GPy/core/gp.py index ab725897..b0b25319 100644 --- a/GPy/core/gp.py +++ b/GPy/core/gp.py @@ -55,7 +55,8 @@ class GP(Model): self.add_parameter(self.kern) self.add_parameter(self.likelihood) - self.parameters_changed() + if self.__class__ is GP: + self.parameters_changed() def parameters_changed(self): self.posterior, self._log_marginal_likelihood, grad_dict = self.inference_method.inference(self.kern, self.X, self.likelihood, self.Y) @@ -111,7 +112,7 @@ class GP(Model): This is to allow for different normalizations of the output dimensions. """ - # normalize X values + #predict the latent function values mu, var = self._raw_predict(Xnew, full_cov=full_cov, which_parts=which_parts) # now push through likelihood diff --git a/GPy/core/sparse_gp.py b/GPy/core/sparse_gp.py index bf28d062..bbbea2fe 100644 --- a/GPy/core/sparse_gp.py +++ b/GPy/core/sparse_gp.py @@ -39,7 +39,7 @@ class SparseGP(GP): if isinstance(likelihood, likelihoods.Gaussian): inference_method = varDTC.VarDTC() else: - #inference_method = ?? + #inference_method = ?? raise NotImplementedError, "what to do what to do?" print "defaulting to ", inference_method, "for latent function inference" @@ -51,19 +51,21 @@ class SparseGP(GP): self.X_variance = X_variance GP.__init__(self, X, Y, kernel, likelihood, inference_method=inference_method, name=name) - self.add_parameter(self.Z, index=0) + self.parameters_changed() + def parameters_changed(self): self.posterior, self._log_marginal_likelihood, self.grad_dict = self.inference_method.inference(self.kern, self.X, self.X_variance, self.Z, self.likelihood, self.Y) - #The derivative of the bound wrt the inducing inputs Z - self.Z.gradient = self.kern.gradients_X(self.grad_dict['dL_dKmm'], self.Z) - if self.X_variance is None: - self.Z.gradient += self.kern.gradients_X(self.grad_dict['dL_dKnm'].T, self.Z, self.X) - else: - self.Z.gradient += self.kern.dpsi1_dZ(self.grad_dict['dL_dpsi1'], self.Z, self.X, self.X_variance) - self.Z.gradient += self.kern.dpsi2_dZ(self.grad_dict['dL_dpsi2'], self.Z, self.X, self.X_variance) + #The derivative of the bound wrt the inducing inputs Z ( unless they're all fixed) + if not self.Z.is_fixed: + self.Z.gradient = self.kern.gradients_X(self.grad_dict['dL_dKmm'], self.Z) + if self.X_variance is None: + self.Z.gradient += self.kern.gradients_X(self.grad_dict['dL_dKnm'].T, self.Z, self.X) + else: + self.Z.gradient += self.kern.dpsi1_dZ(self.grad_dict['dL_dpsi1'], self.Z, self.X, self.X_variance) + self.Z.gradient += self.kern.dpsi2_dZ(self.grad_dict['dL_dpsi2'], self.Z, self.X, self.X_variance) def _raw_predict(self, Xnew, X_variance_new=None, which_parts='all', full_cov=False): """ diff --git a/GPy/inference/latent_function_inference/__init__.py b/GPy/inference/latent_function_inference/__init__.py index c89f771b..dd5d93e0 100644 --- a/GPy/inference/latent_function_inference/__init__.py +++ b/GPy/inference/latent_function_inference/__init__.py @@ -26,5 +26,6 @@ etc. from exact_gaussian_inference import ExactGaussianInference from laplace import LaplaceInference expectation_propagation = 'foo' # TODO +from varDTC import VarDTC from dtc import DTC from fitc import FITC diff --git a/GPy/kern/parts/rbf.py b/GPy/kern/parts/rbf.py index 4b38bd0f..4a8ebd4d 100644 --- a/GPy/kern/parts/rbf.py +++ b/GPy/kern/parts/rbf.py @@ -53,7 +53,7 @@ class RBF(Kernpart): self.variance = Param('variance', variance, Logexp()) - self.lengthscale = Param('lengthscale', lengthscale) + self.lengthscale = Param('lengthscale', lengthscale, Logexp()) self.lengthscale.add_observer(self, self.update_lengthscale) self.update_lengthscale(self.lengthscale) diff --git a/GPy/likelihoods/gaussian.py b/GPy/likelihoods/gaussian.py index 1a596eff..b82750ac 100644 --- a/GPy/likelihoods/gaussian.py +++ b/GPy/likelihoods/gaussian.py @@ -88,12 +88,9 @@ class Gaussian(Likelihood): return mu, var, low, up def predictive_mean(self, mu, sigma): - #new_sigma2 = self.predictive_variance(mu, sigma) - #return new_sigma2*(mu/sigma**2 + self.gp_link.transf(mu)/self.variance) return mu def predictive_variance(self, mu, sigma, predictive_mean=None): - #what on earth was the sum of precisions doing here? JH return self.variance + sigma**2 def pdf_link(self, link_f, y, extra_data=None): @@ -305,3 +302,11 @@ class Gaussian(Likelihood): gp = gp.flatten() Ysim = np.array([np.random.normal(self.gp_link.transf(gpj), scale=np.sqrt(self.variance), size=1) for gpj in gp]) return Ysim.reshape(orig_shape) + + def log_predictive_density(self, y_test, mu_star, var_star): + """ + assumes independence + """ + v = var_star + self.variance + return -0.5*np.log(2*np.pi) -0.5*np.log(v) - 0.5*np.square(y_test - mu_star)/v + diff --git a/GPy/models/sparse_gp_regression.py b/GPy/models/sparse_gp_regression.py index 8740a1f5..61defb7d 100644 --- a/GPy/models/sparse_gp_regression.py +++ b/GPy/models/sparse_gp_regression.py @@ -6,6 +6,7 @@ import numpy as np from ..core import SparseGP from .. import likelihoods from .. import kern +from ..inference.latent_function_inference import VarDTC class SparseGPRegression(SparseGP): """ @@ -43,8 +44,7 @@ class SparseGPRegression(SparseGP): likelihood = likelihoods.Gaussian() - SparseGP.__init__(self, X, Y, Z, kernel, likelihood, X_variance=X_variance) - #self.ensure_default_constraints() + SparseGP.__init__(self, X, Y, Z, kernel, likelihood, X_variance=X_variance, inference_method=VarDTC()) def _getstate(self): return SparseGP._getstate(self)