From 5f92ff67854fba7cec9db36bb80d3cea4ce82b60 Mon Sep 17 00:00:00 2001 From: James Hensman Date: Fri, 30 Nov 2012 10:31:02 +0000 Subject: [PATCH] GPLVM demo working --- GPy/kern/kern.py | 6 +++--- GPy/kern/rbf.py | 12 +++++++----- GPy/kern/white.py | 2 +- GPy/models/GPLVM.py | 7 ++----- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/GPy/kern/kern.py b/GPy/kern/kern.py index cb2ef197..947fb47e 100644 --- a/GPy/kern/kern.py +++ b/GPy/kern/kern.py @@ -170,12 +170,12 @@ class kern(parameterised): [p.dK_dtheta(partial,X[s1,i_s],X2[s2,i_s],target[ps]) for p,i_s,ps,s1,s2 in zip(self.parts, self.input_slices, self.param_slices, slices1, slices2)] return target - def dK_dX(self,X,X2=None,slices1=None,slices2=None): + def dK_dX(self,partial,X,X2=None,slices1=None,slices2=None): if X2 is None: X2 = X slices1, slices2 = self._process_slices(slices1,slices2) - target = np.zeros((X2.shape[0],X.shape[0],X.shape[1])) - [p.dK_dX(X[s1],X2[s2],target[s2,s1,:]) for p,ps,s1,s2 in zip(self.parts, self.param_slices,slices1,slices2)] + target = np.zeros_like(X) + [p.dK_dX(partial,X[s1],X2[s2],target[s1,:]) for p,ps,s1,s2 in zip(self.parts, self.param_slices,slices1,slices2)] return target def Kdiag(self,X,slices=None): diff --git a/GPy/kern/rbf.py b/GPy/kern/rbf.py index 1a8dedd1..087285d1 100644 --- a/GPy/kern/rbf.py +++ b/GPy/kern/rbf.py @@ -6,7 +6,7 @@ from kernpart import kernpart import numpy as np import hashlib -class rbf(kernpart): +class rbf(kernpart): """ Radial Basis Function kernel, aka squared-exponential or Gaussian kernel. @@ -55,13 +55,15 @@ class rbf(kernpart): target[0] += np.sum(self._K_dvar*partial) target[1] += np.sum(self._K_dvar*self.variance*self._K_dist2/self.lengthscale*partial) - def dKdiag_dtheta(self,X,target): - target[0] += partial + def dKdiag_dtheta(self,partial,X,target): + #NB: derivative of diagonal elements wrt lengthscale is 0 + target[0] += np.sum(partial) - def dK_dX(self,X,X2,target): + def dK_dX(self,partial,X,X2,target): self._K_computations(X,X2) _K_dist = X[:,None,:]-X2[None,:,:] - target += np.transpose(-self.variance*self._K_dvar[:,:,np.newaxis]*_K_dist/self.lengthscale2,(1,0,2)) + dK_dX = np.transpose(-self.variance*self._K_dvar[:,:,np.newaxis]*_K_dist/self.lengthscale2,(1,0,2)) + target += np.sum(dK_dX*partial[:,:,None],1) def dKdiag_dX(self,X,target): pass diff --git a/GPy/kern/white.py b/GPy/kern/white.py index 1215e101..beb99416 100644 --- a/GPy/kern/white.py +++ b/GPy/kern/white.py @@ -45,7 +45,7 @@ class white(kernpart): def dKdiag_dtheta(self,X,target): np.add(target[:,0],1.,target[:,0]) - def dK_dX(self,X,X2,target): + def dK_dX(self,partial,X,X2,target): pass def dKdiag_dX(self,X,target): diff --git a/GPy/models/GPLVM.py b/GPy/models/GPLVM.py index db678d84..8f67fe3f 100644 --- a/GPy/models/GPLVM.py +++ b/GPy/models/GPLVM.py @@ -46,11 +46,8 @@ class GPLVM(GP_regression): def log_likelihood_gradients(self): dL_dK = self.dL_dK() - dK_dtheta = self.kern.dK_dtheta(self.X) - dL_dtheta = (dK_dtheta*dL_dK[:,:,None]).sum(0).sum(0) - - dK_dX = self.kern.dK_dX(self.X) - dL_dX = 2.*np.sum(dL_dK[:,:,None]*dK_dX,0) + dL_dtheta = self.kern.dK_dtheta(dL_dK,self.X) + dL_dX = 2*self.kern.dK_dX(dL_dK,self.X) return np.hstack((dL_dX.flatten(),dL_dtheta))