From af510d166a53b548ab12d7dfb60b6d87a1caafb5 Mon Sep 17 00:00:00 2001 From: James Hensman Date: Thu, 7 Mar 2013 16:01:00 +0000 Subject: [PATCH] some changes to product_orthogonal dKdiag_dX is now implemented, some of the cod eis a little tidier --- GPy/kern/product_orthogonal.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/GPy/kern/product_orthogonal.py b/GPy/kern/product_orthogonal.py index 6b02b868..e35c927c 100644 --- a/GPy/kern/product_orthogonal.py +++ b/GPy/kern/product_orthogonal.py @@ -36,13 +36,13 @@ class product_orthogonal(kernpart): def _get_param_names(self): """return parameter names.""" return [self.k1.name + '_' + param_name for param_name in self.k1._get_param_names()] + [self.k2.name + '_' + param_name for param_name in self.k2._get_param_names()] - + def K(self,X,X2,target): """Compute the covariance matrix between X and X2.""" if X2 is None: X2 = X target1 = np.zeros((X.shape[0],X2.shape[0])) target2 = np.zeros((X.shape[0],X2.shape[0])) - self.k1.K(X[:,0:self.k1.D],X2[:,0:self.k1.D],target1) + self.k1.K(X[:,:self.k1.D],X2[:,:self.k1.D],target1) self.k2.K(X[:,self.k1.D:],X2[:,self.k1.D:],target2) target += target1 * target2 @@ -51,21 +51,16 @@ class product_orthogonal(kernpart): if X2 is None: X2 = X K1 = np.zeros((X.shape[0],X2.shape[0])) K2 = np.zeros((X.shape[0],X2.shape[0])) - self.k1.K(X[:,0:self.k1.D],X2[:,0:self.k1.D],K1) + self.k1.K(X[:,:self.k1.D],X2[:,:self.k1.D],K1) self.k2.K(X[:,self.k1.D:],X2[:,self.k1.D:],K2) - k1_target = np.zeros(self.k1.Nparam) - k2_target = np.zeros(self.k2.Nparam) - self.k1.dK_dtheta(partial*K2, X[:,:self.k1.D], X2[:,:self.k1.D], k1_target) - self.k2.dK_dtheta(partial*K1, X[:,self.k1.D:], X2[:,self.k1.D:], k2_target) - - target[:self.k1.Nparam] += k1_target - target[self.k1.Nparam:] += k2_target + self.k1.dK_dtheta(partial*K2, X[:,:self.k1.D], X2[:,:self.k1.D], target[:self.k1.Nparam]) + self.k2.dK_dtheta(partial*K1, X[:,self.k1.D:], X2[:,self.k1.D:], target[self.k1.Nparam:]) def Kdiag(self,X,target): """Compute the diagonal of the covariance matrix associated to X.""" - target1 = np.zeros((X.shape[0],)) - target2 = np.zeros((X.shape[0],)) + target1 = np.zeros(X.shape[0]) + target2 = np.zeros(X.shape[0]) self.k1.Kdiag(X[:,:self.k1.D],target1) self.k2.Kdiag(X[:,self.k1.D:],target2) target += target1 * target2 @@ -89,5 +84,12 @@ class product_orthogonal(kernpart): self.k1.dK_dX(partial*K2, X[:,:self.k1.D], X2[:,:self.k1.D], target) self.k2.dK_dX(partial*K1, X[:,self.k1.D:], X2[:,self.k1.D:], target) - def dKdiag_dX(self,X,target): - pass + def dKdiag_dX(self, partial, X, target): + K1 = np.zeros(X.shape[0]) + K2 = np.zeros(X.shape[0]) + self.k1.Kdiag(X[:,0:self.k1.D],K1) + self.k2.Kdiag(X[:,self.k1.D:],K2) + + self.k1.dK_dX(partial*K2, X[:,:self.k1.D], target) + self.k2.dK_dX(partial*K1, X[:,self.k1.D:], target) +