diff --git a/GPy/core/sparse_gp.py b/GPy/core/sparse_gp.py index bb3116ba..dfe2d38f 100644 --- a/GPy/core/sparse_gp.py +++ b/GPy/core/sparse_gp.py @@ -46,28 +46,33 @@ class SparseGP(GP): self.Z = Param('inducing inputs', Z) self.num_inducing = Z.shape[0] - self.q = NormalPosterior(X, X_variance) - - GP.__init__(self, self.q.mean, Y, kernel, likelihood, inference_method=inference_method, name=name) + if not (X_variance is None): + self.q = NormalPosterior(X, X_variance) + GP.__init__(self, self.q.mean, Y, kernel, likelihood, inference_method=inference_method, name=name) + else: + self.X = X + GP.__init__(self, X, Y, kernel, likelihood, inference_method=inference_method, name=name) + self.add_parameter(self.Z, index=0) self.parameters_changed() def has_uncertain_inputs(self): - return self.q.has_uncertain_inputs() - + return hasattr(self, 'q') + def parameters_changed(self): if self.has_uncertain_inputs(): self.posterior, self._log_marginal_likelihood, self.grad_dict = self.inference_method.inference_latent(self.kern, self.q, self.Z, self.likelihood, self.Y) - else: - 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) - self.likelihood.update_gradients(self.grad_dict.pop('partial_for_likelihood')) - if self.has_uncertain_inputs(): + # gradients + self.likelihood.update_gradients(self.grad_dict.pop('partial_for_likelihood')) self.kern.update_gradients_variational(posterior_variational=self.q, Z=self.Z, **self.grad_dict) self.Z.gradient = self.kern.gradients_Z_variational(posterior_variational=self.q, Z=self.Z, **self.grad_dict) else: + self.posterior, self._log_marginal_likelihood, self.grad_dict = self.inference_method.inference(self.kern, self.X, None, self.Z, self.likelihood, self.Y) + # gradients + self.likelihood.update_gradients(self.grad_dict.pop('partial_for_likelihood')) self.kern.update_gradients_sparse(X=self.X, Z=self.Z, **self.grad_dict) self.Z.gradient = self.kern.gradients_Z_sparse(X=self.X, Z=self.Z, **self.grad_dict) - + def _raw_predict(self, Xnew, X_variance_new=None, full_cov=False): """ Make a prediction for the latent function values diff --git a/GPy/examples/dimensionality_reduction.py b/GPy/examples/dimensionality_reduction.py index a2686d73..4345cb90 100644 --- a/GPy/examples/dimensionality_reduction.py +++ b/GPy/examples/dimensionality_reduction.py @@ -164,7 +164,7 @@ def bgplvm_oil(optimize=True, verbose=1, plot=True, N=200, Q=7, num_inducing=40, _np.random.seed(0) data = GPy.util.datasets.oil() - kernel = GPy.kern.RBF(Q, 1., _np.random.uniform(0,1,(Q,)), ARD=True)# + GPy.kern.Bias(Q, _np.exp(-2)) + kernel = GPy.kern.RBF(Q, 1., 1./_np.random.uniform(0,1,(Q,)), ARD=True)# + GPy.kern.Bias(Q, _np.exp(-2)) Y = data['X'][:N] m = GPy.models.BayesianGPLVM(Y, Q, kernel=kernel, num_inducing=num_inducing, **k) m.data_labels = data['Y'][:N].argmax(axis=1) @@ -270,7 +270,7 @@ def bgplvm_simulation(optimize=True, verbose=1, from GPy import kern from GPy.models import BayesianGPLVM - D1, D2, D3, N, num_inducing, Q = 15, 5, 8, 30, 3, 10 + D1, D2, D3, N, num_inducing, Q = 13, 5, 8, 45, 5, 9 _, _, Ylist = _simulate_sincos(D1, D2, D3, N, num_inducing, Q, plot_sim) Y = Ylist[0] k = kern.Linear(Q, ARD=True)# + kern.white(Q, _np.exp(-2)) # + kern.bias(Q) @@ -293,7 +293,7 @@ def bgplvm_simulation_missing_data(optimize=True, verbose=1, from GPy.models import BayesianGPLVM from GPy.inference.latent_function_inference.var_dtc import VarDTCMissingData - D1, D2, D3, N, num_inducing, Q = 15, 5, 8, 30, 5, 9 + D1, D2, D3, N, num_inducing, Q = 13, 5, 8, 45, 5, 9 _, _, Ylist = _simulate_sincos(D1, D2, D3, N, num_inducing, Q, plot_sim) Y = Ylist[0] k = kern.Linear(Q, ARD=True)# + kern.white(Q, _np.exp(-2)) # + kern.bias(Q) diff --git a/GPy/inference/latent_function_inference/var_dtc.py b/GPy/inference/latent_function_inference/var_dtc.py index 349cd72d..cc630bfa 100644 --- a/GPy/inference/latent_function_inference/var_dtc.py +++ b/GPy/inference/latent_function_inference/var_dtc.py @@ -45,7 +45,7 @@ class VarDTC(object): def inference(self, kern, X, X_variance, Z, likelihood, Y): """Inference for normal sparseGP""" uncertain_inputs = False - psi0, psi1, psi2 = _compute_psi(kern, X, X_variance, Z, uncertain_inputs) + psi0, psi1, psi2 = _compute_psi(kern, X, Z) return self._inference(kern, psi0, psi1, psi2, Z, likelihood, Y, uncertain_inputs) def inference_latent(self, kern, posterior_variational, Z, likelihood, Y): @@ -205,7 +205,7 @@ class VarDTCMissingData(object): def inference(self, kern, X, X_variance, Z, likelihood, Y): """Inference for normal sparseGP""" uncertain_inputs = False - psi0, psi1, psi2 = _compute_psi(kern, X, X_variance, Z, uncertain_inputs) + psi0, psi1, psi2 = _compute_psi(kern, X, Z) return self._inference(kern, psi0, psi1, psi2, Z, likelihood, Y, uncertain_inputs) def inference_latent(self, kern, posterior_variational, Z, likelihood, Y): @@ -358,7 +358,7 @@ class VarDTCMissingData(object): return post, log_marginal, grad_dict -def _compute_psi(kern, X, X_variance, Z): +def _compute_psi(kern, X, Z): psi0 = kern.Kdiag(X) psi1 = kern.K(X, Z) psi2 = None diff --git a/GPy/models/bayesian_gplvm.py b/GPy/models/bayesian_gplvm.py index 74b8abe0..8455c7a1 100644 --- a/GPy/models/bayesian_gplvm.py +++ b/GPy/models/bayesian_gplvm.py @@ -41,7 +41,7 @@ class BayesianGPLVM(SparseGP): if likelihood is None: likelihood = Gaussian() - self.q = NormalPosterior(X, X_variance) + #self.q = NormalPosterior(X, X_variance) self.variational_prior = NormalPrior() SparseGP.__init__(self, X, Y, Z, kernel, likelihood, inference_method, X_variance, name, **kwargs)