From 1b85b45a7e374b47786bdd9c39ef9273352ee848 Mon Sep 17 00:00:00 2001 From: Zhenwen Dai Date: Thu, 17 Mar 2016 14:05:49 +0000 Subject: [PATCH 1/3] numerical stable implementation of rational qudratic --- GPy/kern/src/stationary.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/GPy/kern/src/stationary.py b/GPy/kern/src/stationary.py index 286edcc2..fa7c8bd3 100644 --- a/GPy/kern/src/stationary.py +++ b/GPy/kern/src/stationary.py @@ -489,18 +489,21 @@ class RatQuad(Stationary): self.link_parameters(self.power) def K_of_r(self, r): - r2 = np.power(r, 2.) - return self.variance*np.power(1. + r2/2., -self.power) + r2 = np.square(r) +# return self.variance*np.power(1. + r2/2., -self.power) + return self.variance*np.exp(-self.power*np.log1p(r2/2.)) def dK_dr(self, r): - r2 = np.power(r, 2.) - return -self.variance*self.power*r*np.power(1. + r2/2., - self.power - 1.) + r2 = np.square(r) +# return -self.variance*self.power*r*np.power(1. + r2/2., - self.power - 1.) + return-self.variance*self.power*r*np.exp(-(self.power+1)*np.log1p(r2/2.)) def update_gradients_full(self, dL_dK, X, X2=None): super(RatQuad, self).update_gradients_full(dL_dK, X, X2) r = self._scaled_dist(X, X2) - r2 = np.power(r, 2.) - dK_dpow = -self.variance * np.power(2., self.power) * np.power(r2 + 2., -self.power) * np.log(0.5*(r2+2.)) + r2 = np.square(r) +# dK_dpow = -self.variance * np.power(2., self.power) * np.power(r2 + 2., -self.power) * np.log(0.5*(r2+2.)) + dK_dpow = -self.variance * np.exp(self.power*(np.log(2.)-np.log1p(r2+1)))*np.log1p(r2/2.) grad = np.sum(dL_dK*dK_dpow) self.power.gradient = grad From fd2fc557c67b0fc08283fe4d7e575acbdfa0a012 Mon Sep 17 00:00:00 2001 From: Zhenwen Dai Date: Tue, 29 Mar 2016 14:45:55 +0100 Subject: [PATCH 2/3] implement the gradient_X for standard_periodic kernel --- GPy/kern/src/standard_periodic.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/GPy/kern/src/standard_periodic.py b/GPy/kern/src/standard_periodic.py index e0c76d0c..b020d8e7 100644 --- a/GPy/kern/src/standard_periodic.py +++ b/GPy/kern/src/standard_periodic.py @@ -155,11 +155,14 @@ class StdPeriodic(Kern): self.period.gradient = 0 self.lengthscale.gradient = 0 -# def gradients_X(self, dL_dK, X, X2=None): -# """derivative of the covariance matrix with respect to X.""" -# -# raise NotImplemented("Periodic kernel: dK_dX not implemented") -# -# def gradients_X_diag(self, dL_dKdiag, X): -# -# raise NotImplemented("Periodic kernel: dKdiag_dX not implemented") + def gradients_X(self, dL_dK, X, X2=None): + K = self.K(X, X2) + if X2 is None: + dL_dK = dL_dK+dL_dK.T + X2 = X + dX = -np.pi*((dL_dK*K)[:,:,None]*np.sin(2*np.pi/self.period*(X[:,None,:] - X2[None,:,:]))/(2.*np.square(self.lengthscale)*self.period)).sum(1) + return dX + + def gradients_X_diag(self, dL_dKdiag, X): + return np.zeros(X.shape) + \ No newline at end of file From 44e164b8fbbe0c1dce0a8ca0b521fa5c162d22af Mon Sep 17 00:00:00 2001 From: Zhenwen Dai Date: Tue, 29 Mar 2016 15:09:19 +0100 Subject: [PATCH 3/3] implement sensitivie of periodic kernel for plot_ARD --- GPy/kern/src/standard_periodic.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/GPy/kern/src/standard_periodic.py b/GPy/kern/src/standard_periodic.py index b020d8e7..d45e8d16 100644 --- a/GPy/kern/src/standard_periodic.py +++ b/GPy/kern/src/standard_periodic.py @@ -165,4 +165,6 @@ class StdPeriodic(Kern): def gradients_X_diag(self, dL_dKdiag, X): return np.zeros(X.shape) - \ No newline at end of file + + def input_sensitivity(self, summarize=True): + return self.variance*np.ones(self.input_dim)/self.lengthscale**2 \ No newline at end of file