From eb526005374a1ff9e512d64e4a75f0799173c752 Mon Sep 17 00:00:00 2001 From: James Hensman Date: Fri, 24 Jan 2014 12:13:55 +0000 Subject: [PATCH] added new gradient functinoality to rbf --- GPy/kern/parts/rbf.py | 218 +++++++++++++++++++++++------------------- 1 file changed, 119 insertions(+), 99 deletions(-) diff --git a/GPy/kern/parts/rbf.py b/GPy/kern/parts/rbf.py index b8152622..757ebd09 100644 --- a/GPy/kern/parts/rbf.py +++ b/GPy/kern/parts/rbf.py @@ -36,7 +36,7 @@ class RBF(Kernpart): super(RBF, self).__init__(input_dim, name) self.input_dim = input_dim self.ARD = ARD - + if not ARD: if lengthscale is not None: lengthscale = np.asarray(lengthscale) @@ -55,7 +55,7 @@ class RBF(Kernpart): self.lengthscale.add_observer(self, self.update_lengthscale) self.add_parameters(self.variance, self.lengthscale) self.parameters_changed() # initializes cache - + #self.update_inv_lengthscale(self.lengthscale) #self.parameters_changed() # initialize cache @@ -67,99 +67,90 @@ class RBF(Kernpart): # 'extra_compile_args': ['-fopenmp -O3'], # -march=native'], # 'extra_link_args' : ['-lgomp']} self.weave_options = {} - + def on_input_change(self, X): #self._K_computations(X, None) pass - + def update_lengthscale(self, l): self.lengthscale2 = np.square(self.lengthscale) - + def parameters_changed(self): # reset cached results - #self._X, self._X2, self._params_save = np.empty(shape=(3, 1)) - #self._Z, self._mu, self._S = np.empty(shape=(3, 1)) # cached versions of Z,mu,S self._X, self._X2 = np.empty(shape=(2, 1)) self._Z, self._mu, self._S = np.empty(shape=(3, 1)) # cached versions of Z,mu,S - pass -# def _get_params(self): -# return np.hstack((self.variance, self.lengthscale)) -# # -# def _set_params(self, x): -# assert x.size == (self.num_params) -# #self.variance = x[0] -# #self.lengthscale = x[1:] -# -# #self.lengthscale2 = np.square(self.lengthscale) -# -# # reset cached results -# #self._X, self._X2, self._params_save = np.empty(shape=(3, 1)) -# #self._Z, self._mu, self._S = np.empty(shape=(3, 1)) # cached versions of Z,mu,S -# -# def _get_param_names(self): -# if self.num_params == 2: -# return ['variance', 'lengthscale'] -# else: -# return ['variance'] + ['lengthscale_%i' % i for i in range(self.lengthscale.size)] def K(self, X, X2, target): - #if self._X is None or X.base is not self._X.base or X2 is not None: self._K_computations(X, X2) target += self.variance * self._K_dvar def Kdiag(self, X, target): np.add(target, self.variance, target) - def dK_dtheta(self, dL_dK, X, X2, target): - #if self._X is None or X.base is not self._X.base or X2 is not None: + def update_gradients_full(self, dL_dK, X): self._K_computations(X, X2) - target[0] += np.sum(self._K_dvar * dL_dK) + self.variance.gradient = np.sum(self._K_dvar * dL_dK) if self.ARD: - dvardLdK = self._K_dvar * dL_dK - var_len3 = self.variance / np.power(self.lengthscale, 3) - if X2 is None: - # save computation for the symmetrical case - dvardLdK = dvardLdK + dvardLdK.T - code = """ - int q,i,j; - double tmp; - for(q=0; q