From ece4e2442c3c5492fc514a3007d38de7a2837bf5 Mon Sep 17 00:00:00 2001 From: Nicolo Fusi Date: Wed, 30 Jan 2013 11:18:22 +0000 Subject: [PATCH] working on cross terms --- GPy/kern/kern.py | 9 +++++---- GPy/models/sparse_GP_regression.py | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/GPy/kern/kern.py b/GPy/kern/kern.py index 7da4926a..89c02bc2 100644 --- a/GPy/kern/kern.py +++ b/GPy/kern/kern.py @@ -273,7 +273,7 @@ class kern(parameterised): return target - def dpsi2_dtheta(self,partial,Z,mu,S,slices1=None,slices2=None): + def dpsi2_dtheta(self,partial,partial1,Z,mu,S,slices1=None,slices2=None): """Returns shape (N,M,M,Ntheta)""" slices1, slices2 = self._process_slices(slices1,slices2) target = np.zeros(self.Nparam) @@ -286,12 +286,13 @@ class kern(parameterised): [p.psi1(Z[s2],mu[s1],S[s1],psi1_target[s1,s2]) for p,s1,s2,psi1_target in zip(self.parts,slices1,slices2, psi1_matrices)] # 2. get all the dpsi1/dtheta gradients psi1_gradients = [np.zeros(self.Nparam) for p in self.parts] - [p.dpsi1_dtheta(partial[s2,s1],Z[s2,i_s],mu[s1,i_s],S[s1,i_s],target[ps]) for p,ps,s1,s2,i_s in zip(self.parts, self.param_slices,slices1,slices2,self.input_slices)] + [p.dpsi1_dtheta(partial1[s2,s1],Z[s2,i_s],mu[s1,i_s],S[s1,i_s],psi1g_target[ps]) for p,ps,s1,s2,i_s,psi1g_target in zip(self.parts, self.param_slices,slices1,slices2,self.input_slices,psi1_gradients)] + # 3. multiply them somehow for a,b in itertools.combinations(range(len(psi1_matrices)), 2): - psi2_cross = np.multiply(psi1, psi1_grad) # some newaxis of this - target += psi2_cross[:,None,:] + psi2_cross[:, :,None] + gne = (psi1_gradients[a][None]*psi1_matrices[b].sum(0)[:,None]).sum(0) + target += 0#(gne[None] + gne[:, None]).sum(0) return target def dpsi2_dZ(self,partial,Z,mu,S,slices1=None,slices2=None): diff --git a/GPy/models/sparse_GP_regression.py b/GPy/models/sparse_GP_regression.py index 8ea99116..e0a8a35d 100644 --- a/GPy/models/sparse_GP_regression.py +++ b/GPy/models/sparse_GP_regression.py @@ -149,7 +149,7 @@ class sparse_GP_regression(GP_regression): if self.has_uncertain_inputs: dL_dtheta += self.kern.dpsi0_dtheta(self.dL_dpsi0, self.Z,self.X,self.X_uncertainty) dL_dtheta += self.kern.dpsi1_dtheta(self.dL_dpsi1.T,self.Z,self.X, self.X_uncertainty) - dL_dtheta += self.kern.dpsi2_dtheta(self.dL_dpsi2,self.Z,self.X, self.X_uncertainty) # for multiple_beta, dL_dpsi2 will be a different shape + dL_dtheta += self.kern.dpsi2_dtheta(self.dL_dpsi2,self.dL_dpsi1.T, self.Z,self.X, self.X_uncertainty) # for multiple_beta, dL_dpsi2 will be a different shape else: #re-cast computations in psi2 back to psi1: dL_dpsi1 = self.dL_dpsi1 + 2.*np.dot(self.dL_dpsi2.sum(0),self.psi1)