From 10f3f7d14a9b3b9decb7bbff7f8fca9d50a421a5 Mon Sep 17 00:00:00 2001 From: Alan Saul Date: Thu, 17 Oct 2013 18:33:08 +0100 Subject: [PATCH] Refactored gradients wrt parameters slightly, need to future proof against _get_param_names() disappearing --- GPy/likelihoods/laplace.py | 5 ++- .../noise_models/noise_distributions.py | 42 ++++++++++++------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/GPy/likelihoods/laplace.py b/GPy/likelihoods/laplace.py index 8019e430..33594da8 100644 --- a/GPy/likelihoods/laplace.py +++ b/GPy/likelihoods/laplace.py @@ -123,7 +123,9 @@ class Laplace(likelihood): dL_dfhat, I_KW_i = self._shared_gradients_components() dlik_dthetaL, dlik_grad_dthetaL, dlik_hess_dthetaL = self.noise_model._laplace_gradients(self.f_hat, self.data, extra_data=self.extra_data) - num_params = len(dlik_dthetaL) + #len(dlik_dthetaL) + num_params = len(self._get_param_names()) + print num_params # make space for one derivative for each likelihood parameter dL_dthetaL = np.zeros(num_params) for thetaL_i in range(num_params): @@ -138,6 +140,7 @@ class Laplace(likelihood): dL_dthetaL_imp = np.dot(dL_dfhat, dfhat_dthetaL) dL_dthetaL[thetaL_i] = dL_dthetaL_exp + dL_dthetaL_imp + print dL_dthetaL return dL_dthetaL def _compute_GP_variables(self): diff --git a/GPy/likelihoods/noise_models/noise_distributions.py b/GPy/likelihoods/noise_models/noise_distributions.py index dc3a7de5..0bb106b2 100644 --- a/GPy/likelihoods/noise_models/noise_distributions.py +++ b/GPy/likelihoods/noise_models/noise_distributions.py @@ -270,6 +270,7 @@ class NoiseDistribution(object): def _predictive_mean_numerical(self,mu,sigma): """ Laplace approximation to the predictive mean: E(Y_star|Y) = E( E(Y_star|f_star, Y) ) + if self. :param mu: cavity distribution mean :param sigma: cavity distribution standard deviation @@ -541,32 +542,45 @@ class NoiseDistribution(object): """ TODO: Doc strings """ - link_f = self.gp_link.transf(f) - return self.dlogpdf_link_dtheta(link_f, y, extra_data=extra_data) + if len(self._get_param_names()) > 0: + link_f = self.gp_link.transf(f) + return self.dlogpdf_link_dtheta(link_f, y, extra_data=extra_data) + else: + #Is no parameters so return an empty array for its derivatives + return np.empty([1, 0]) def dlogpdf_df_dtheta(self, f, y, extra_data=None): """ TODO: Doc strings """ - link_f = self.gp_link.transf(f) - dlink_df = self.gp_link.dtransf_df(f) - dlogpdf_dlink_dtheta = self.dlogpdf_dlink_dtheta(link_f, y, extra_data=extra_data) - return chain_1(dlogpdf_dlink_dtheta, dlink_df) + if len(self._get_param_names()) > 0: + link_f = self.gp_link.transf(f) + dlink_df = self.gp_link.dtransf_df(f) + dlogpdf_dlink_dtheta = self.dlogpdf_dlink_dtheta(link_f, y, extra_data=extra_data) + return chain_1(dlogpdf_dlink_dtheta, dlink_df) + else: + #Is no parameters so return an empty array for its derivatives + return np.empty([f.shape[0], 0]) def d2logpdf_df2_dtheta(self, f, y, extra_data=None): """ TODO: Doc strings """ - link_f = self.gp_link.transf(f) - dlink_df = self.gp_link.dtransf_df(f) - d2link_df2 = self.gp_link.d2transf_df2(f) - d2logpdf_dlink2_dtheta = self.d2logpdf_dlink2_dtheta(link_f, y, extra_data=extra_data) - dlogpdf_dlink_dtheta = self.dlogpdf_dlink_dtheta(link_f, y, extra_data=extra_data) - #FIXME: Why isn't this chain_1? - #return chain_1(d2logpdf_dlink2_dtheta, d2link_df2) - return chain_2(d2logpdf_dlink2_dtheta, dlink_df, dlogpdf_dlink_dtheta, d2link_df2) + if len(self._get_param_names()) > 0: + link_f = self.gp_link.transf(f) + dlink_df = self.gp_link.dtransf_df(f) + d2link_df2 = self.gp_link.d2transf_df2(f) + d2logpdf_dlink2_dtheta = self.d2logpdf_dlink2_dtheta(link_f, y, extra_data=extra_data) + dlogpdf_dlink_dtheta = self.dlogpdf_dlink_dtheta(link_f, y, extra_data=extra_data) + #FIXME: Why isn't this chain_1? + #return chain_1(d2logpdf_dlink2_dtheta, d2link_df2) + return chain_2(d2logpdf_dlink2_dtheta, dlink_df, dlogpdf_dlink_dtheta, d2link_df2) + else: + #Is no parameters so return an empty array for its derivatives + return np.empty([f.shape[0], 0]) def _laplace_gradients(self, f, y, extra_data=None): + #Bit nasty we recompute thesesome of these but it keeps it modular #link_f = self.gp_link.transf(f) #dlink_df = self.gp_link.dtransf_df(f) #d2link_df2 = self.gp_link.d2transf_df2(f)