Refactored gradients wrt parameters slightly, need to future proof against _get_param_names() disappearing

This commit is contained in:
Alan Saul 2013-10-17 18:33:08 +01:00
parent 1848653fce
commit 10f3f7d14a
2 changed files with 32 additions and 15 deletions

View file

@ -123,7 +123,9 @@ class Laplace(likelihood):
dL_dfhat, I_KW_i = self._shared_gradients_components() 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) 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 # make space for one derivative for each likelihood parameter
dL_dthetaL = np.zeros(num_params) dL_dthetaL = np.zeros(num_params)
for thetaL_i in range(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_imp = np.dot(dL_dfhat, dfhat_dthetaL)
dL_dthetaL[thetaL_i] = dL_dthetaL_exp + dL_dthetaL_imp dL_dthetaL[thetaL_i] = dL_dthetaL_exp + dL_dthetaL_imp
print dL_dthetaL
return dL_dthetaL return dL_dthetaL
def _compute_GP_variables(self): def _compute_GP_variables(self):

View file

@ -270,6 +270,7 @@ class NoiseDistribution(object):
def _predictive_mean_numerical(self,mu,sigma): def _predictive_mean_numerical(self,mu,sigma):
""" """
Laplace approximation to the predictive mean: E(Y_star|Y) = E( E(Y_star|f_star, Y) ) 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 mu: cavity distribution mean
:param sigma: cavity distribution standard deviation :param sigma: cavity distribution standard deviation
@ -541,22 +542,31 @@ class NoiseDistribution(object):
""" """
TODO: Doc strings TODO: Doc strings
""" """
if len(self._get_param_names()) > 0:
link_f = self.gp_link.transf(f) link_f = self.gp_link.transf(f)
return self.dlogpdf_link_dtheta(link_f, y, extra_data=extra_data) 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): def dlogpdf_df_dtheta(self, f, y, extra_data=None):
""" """
TODO: Doc strings TODO: Doc strings
""" """
if len(self._get_param_names()) > 0:
link_f = self.gp_link.transf(f) link_f = self.gp_link.transf(f)
dlink_df = self.gp_link.dtransf_df(f) dlink_df = self.gp_link.dtransf_df(f)
dlogpdf_dlink_dtheta = self.dlogpdf_dlink_dtheta(link_f, y, extra_data=extra_data) dlogpdf_dlink_dtheta = self.dlogpdf_dlink_dtheta(link_f, y, extra_data=extra_data)
return chain_1(dlogpdf_dlink_dtheta, dlink_df) 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): def d2logpdf_df2_dtheta(self, f, y, extra_data=None):
""" """
TODO: Doc strings TODO: Doc strings
""" """
if len(self._get_param_names()) > 0:
link_f = self.gp_link.transf(f) link_f = self.gp_link.transf(f)
dlink_df = self.gp_link.dtransf_df(f) dlink_df = self.gp_link.dtransf_df(f)
d2link_df2 = self.gp_link.d2transf_df2(f) d2link_df2 = self.gp_link.d2transf_df2(f)
@ -565,8 +575,12 @@ class NoiseDistribution(object):
#FIXME: Why isn't this chain_1? #FIXME: Why isn't this chain_1?
#return chain_1(d2logpdf_dlink2_dtheta, d2link_df2) #return chain_1(d2logpdf_dlink2_dtheta, d2link_df2)
return chain_2(d2logpdf_dlink2_dtheta, dlink_df, dlogpdf_dlink_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): 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) #link_f = self.gp_link.transf(f)
#dlink_df = self.gp_link.dtransf_df(f) #dlink_df = self.gp_link.dtransf_df(f)
#d2link_df2 = self.gp_link.d2transf_df2(f) #d2link_df2 = self.gp_link.d2transf_df2(f)