diff --git a/GPy/kern/src/add.py b/GPy/kern/src/add.py index bb04495c..5ac773c9 100644 --- a/GPy/kern/src/add.py +++ b/GPy/kern/src/add.py @@ -100,7 +100,7 @@ class Add(CombinationKernel): return target def gradients_XX_diag(self, dL_dKdiag, X, cov=True): - target = np.zeros(X.shape) + target = np.zeros(X.shape+(X.shape[1],)) [target.__iadd__(p.gradients_XX_diag(dL_dKdiag, X, cov=cov)) for p in self.parts] return target diff --git a/GPy/kern/src/stationary.py b/GPy/kern/src/stationary.py index 8f6d1804..34256d95 100644 --- a/GPy/kern/src/stationary.py +++ b/GPy/kern/src/stationary.py @@ -273,9 +273,9 @@ class Stationary(Kern): #np.sum( - (tmp2*(tmpdist**2)), axis=1, out=grad[:,q]) return grad - def gradients_XX_diag(self, dL_dK, X, cov=True): + def gradients_XX_diag(self, d2L_dK, X, cov=True): """ - Given the derivative of the objective dL_dK, compute the second derivative of K wrt X: + Given the derivative of the objective d2L_dK, compute the second derivative of K wrt X: ..math: \frac{\partial^2 K}{\partial X\partial X} diff --git a/GPy/testing/kernel_tests.py b/GPy/testing/kernel_tests.py index f2b95be8..d89f35e8 100644 --- a/GPy/testing/kernel_tests.py +++ b/GPy/testing/kernel_tests.py @@ -120,25 +120,8 @@ class Kern_check_d2K_dXdX_cov(Kern_check_model): grads = self.kernel.gradients_XX(self.dL_dK, self.X, self.X2, cov=True) self.X.gradient[:] = grads.sum(-1).sum(1) -class Kern_check_d2K_dXdX_no_cov(Kern_check_model): - """This class allows gradient checks for the secondderivative of a kernel with respect to X. """ - def __init__(self, kernel=None, dL_dK=None, X=None, X2=None): - Kern_check_model.__init__(self,kernel=kernel,dL_dK=dL_dK, X=X, X2=X2) - self.X = Param('X',X) - self.link_parameter(self.X) - - def log_likelihood(self): - return np.sum(self.kernel.gradients_X(self.dL_dK,self.X, self.X2)) - - def parameters_changed(self): - #if self.kernel.name == 'rbf': - # import ipdb;ipdb.set_trace() - grads = self.kernel.gradients_XX(self.dL_dK, self.X, self.X2, cov=False) - self.X.gradient[:] = grads.sum(1) - - class Kern_check_d2Kdiag_dXdX_cov(Kern_check_model): - """This class allows gradient checks for the secondderivative of a kernel with respect to X. """ + """This class allows gradient checks for the second derivative of a kernel with respect to X. """ def __init__(self, kernel=None, dL_dK=None, X=None, X2=None): Kern_check_model.__init__(self,kernel=kernel,dL_dK=dL_dK, X=X, X2=X2) self.X = Param('X',X) @@ -151,23 +134,6 @@ class Kern_check_d2Kdiag_dXdX_cov(Kern_check_model): grads = self.kernel.gradients_XX_diag(self.dL_dK.diagonal(), self.X, cov=True) self.X.gradient[:] = grads.sum(-1) -class Kern_check_d2Kdiag_dXdX_no_cov(Kern_check_model): - """This class allows gradient checks for the secondderivative of a kernel with respect to X. """ - def __init__(self, kernel=None, dL_dK=None, X=None, X2=None): - Kern_check_model.__init__(self,kernel=kernel,dL_dK=dL_dK, X=X, X2=X2) - self.X = Param('X',X) - self.link_parameter(self.X) - - def log_likelihood(self): - return np.sum(self.kernel.gradients_X_diag(self.dL_dK.diagonal(),self.X)) - - def parameters_changed(self): - grads = self.kernel.gradients_XX_diag(self.dL_dK.diagonal(), self.X, cov=False) - self.X.gradient[:] = grads - -# class Kern_check_d2Kdiag_dXdX(Kern_check_model): -# """This class allows gradient checks for the secondderivative of a kernel diagonal with respect to X. """ - def check_kernel_gradient_functions(kern, X=None, X2=None, output_ind=None, verbose=False, fixed_X_dims=None): """ This function runs on kernels to check the correctness of their @@ -304,46 +270,6 @@ def check_kernel_gradient_functions(kern, X=None, X2=None, output_ind=None, verb assert(result) return False - if verbose: - print("Checking gradients of dK(X, X) wrt X.") - try: - testmodel = Kern_check_d2K_dXdX_no_cov(kern, X=X, X2=None) - if fixed_X_dims is not None: - testmodel.X[:,fixed_X_dims].fix() - result = testmodel.checkgrad(verbose=verbose) - except NotImplementedError: - result=True - if verbose: - print(("gradients_X not implemented for " + kern.name)) - if result and verbose: - print("Check passed.") - if not result: - print(("Gradient of dK(X, X) wrt X failed for " + kern.name + " covariance function. Gradient values as follows:")) - testmodel.checkgrad(verbose=True) - assert(result) - pass_checks = False - return False - - if verbose: - print("Checking gradients of dK(X, X2) wrt X.") - try: - testmodel = Kern_check_d2K_dXdX_no_cov(kern, X=X, X2=X2) - if fixed_X_dims is not None: - testmodel.X[:,fixed_X_dims].fix() - result = testmodel.checkgrad(verbose=verbose) - except NotImplementedError: - result=True - if verbose: - print(("gradients_X not implemented for " + kern.name)) - if result and verbose: - print("Check passed.") - if not result: - print(("Gradient of dK(X, X2) wrt X failed for " + kern.name + " covariance function. Gradient values as follows:")) - testmodel.checkgrad(verbose=True) - assert(result) - pass_checks = False - return False - if verbose: print("Checking gradients of dK(X, X) wrt X with full cov in dimensions") try: @@ -384,27 +310,6 @@ def check_kernel_gradient_functions(kern, X=None, X2=None, output_ind=None, verb pass_checks = False return False - - if verbose: - print("Checking gradients of dKdiag(X, X) wrt X.") - try: - testmodel = Kern_check_d2Kdiag_dXdX_no_cov(kern, X=X, X2=None) - if fixed_X_dims is not None: - testmodel.X[:,fixed_X_dims].fix() - result = testmodel.checkgrad(verbose=verbose) - except NotImplementedError: - result=True - if verbose: - print(("gradients_X not implemented for " + kern.name)) - if result and verbose: - print("Check passed.") - if not result: - print(("Gradient of dKdiag(X, X) wrt X failed for " + kern.name + " covariance function. Gradient values as follows:")) - testmodel.checkgrad(verbose=True) - assert(result) - pass_checks = False - return False - if verbose: print("Checking gradients of dKdiag(X, X) wrt X with cov in dimensions") try: