From fba121c826ad9ee51b7024f0da452fd434f7b4d4 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Tue, 22 Oct 2013 13:38:29 +0100 Subject: [PATCH] kern is now parameterized --- GPy/kern/parts/kernpart.py | 2 ++ GPy/kern/parts/rbf.py | 51 ++++++++++++++++++++++---------------- GPy/kern/parts/white.py | 9 ++++--- 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/GPy/kern/parts/kernpart.py b/GPy/kern/parts/kernpart.py index 4dfb07a3..5ca8dd34 100644 --- a/GPy/kern/parts/kernpart.py +++ b/GPy/kern/parts/kernpart.py @@ -22,6 +22,7 @@ class Kernpart(object): self.name = 'unnamed' # link to parameterized objects self._parameters_ = [] + def set_as_parameter_named(self, name, gradient, index=None, *args, **kwargs): """ :param names: name of parameter to set as parameter @@ -49,6 +50,7 @@ class Kernpart(object): self._parameters_.append(p) else: self._parameters_.insert(index, p) + self.__dict__[name] = p #set_as_parameter.__doc__ += set_as_parameter.__doc__ # @UndefinedVariable # def _get_params(self): # raise NotImplementedError diff --git a/GPy/kern/parts/rbf.py b/GPy/kern/parts/rbf.py index ae6722ba..93a7e607 100644 --- a/GPy/kern/parts/rbf.py +++ b/GPy/kern/parts/rbf.py @@ -33,10 +33,11 @@ class RBF(Kernpart): """ def __init__(self, input_dim, variance=1., lengthscale=None, ARD=False, name='rbf'): + super(RBF, self).__init__(input_dim) self.input_dim = input_dim self.name = name self.ARD = ARD - self.variance = variance + if not ARD: self.num_params = 2 if lengthscale is not None: @@ -53,15 +54,21 @@ class RBF(Kernpart): lengthscale = np.ones(self.input_dim) #self._set_params(np.hstack((variance, lengthscale.flatten()))) - self.set_as_parameter_named('variance', ) + self.variance = variance + self.lengthscale = lengthscale + self.set_as_parameter('variance', self.variance, None) + self.set_as_parameter('lengthscale', self.lengthscale, None) + # initialize cache self._Z, self._mu, self._S = np.empty(shape=(3, 1)) self._X, self._X2, self._params_save = np.empty(shape=(3, 1)) # a set of optional args to pass to weave self.weave_options = {'headers' : [''], - 'extra_compile_args': ['-fopenmp -O3'], # -march=native'], - 'extra_link_args' : ['-lgomp']} + 'extra_compile_args': ['-fopenmp -O3'], # -march=native'], + 'extra_link_args' : ['-lgomp']} + + def parameters_changed(self): self.lengthscale2 = np.square(self.lengthscale) @@ -69,25 +76,27 @@ class RBF(Kernpart): 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_params(self): -# return np.hstack((self.variance, self.lengthscale)) + 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 _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 _dK_dvariance(self, model): + def _dK_dvariance(self, model, target): pass def K(self, X, X2, target): diff --git a/GPy/kern/parts/white.py b/GPy/kern/parts/white.py index 49200bd6..2307c812 100644 --- a/GPy/kern/parts/white.py +++ b/GPy/kern/parts/white.py @@ -14,19 +14,22 @@ class White(Kernpart): :type variance: float """ def __init__(self,input_dim,variance=1.): + super(White, self).__init__(input_dim) self.input_dim = input_dim self.num_params = 1 self.name = 'white' - self._set_params(np.array([variance]).flatten()) + self.variance=variance + self.set_as_parameter_named('variance', None) +# self._set_params(np.array([variance]).flatten()) self._psi1 = 0 # TODO: more elegance here def _get_params(self): return self.variance - + def _set_params(self,x): assert x.shape==(1,) self.variance = x - + def _get_param_names(self): return ['variance']