kern is now parameterized

This commit is contained in:
Max Zwiessele 2013-10-22 13:38:29 +01:00
parent d5afb3b797
commit fba121c826
3 changed files with 38 additions and 24 deletions

View file

@ -22,6 +22,7 @@ class Kernpart(object):
self.name = 'unnamed' self.name = 'unnamed'
# link to parameterized objects # link to parameterized objects
self._parameters_ = [] self._parameters_ = []
def set_as_parameter_named(self, name, gradient, index=None, *args, **kwargs): def set_as_parameter_named(self, name, gradient, index=None, *args, **kwargs):
""" """
:param names: name of parameter to set as parameter :param names: name of parameter to set as parameter
@ -49,6 +50,7 @@ class Kernpart(object):
self._parameters_.append(p) self._parameters_.append(p)
else: else:
self._parameters_.insert(index, p) self._parameters_.insert(index, p)
self.__dict__[name] = p
#set_as_parameter.__doc__ += set_as_parameter.__doc__ # @UndefinedVariable #set_as_parameter.__doc__ += set_as_parameter.__doc__ # @UndefinedVariable
# def _get_params(self): # def _get_params(self):
# raise NotImplementedError # raise NotImplementedError

View file

@ -33,10 +33,11 @@ class RBF(Kernpart):
""" """
def __init__(self, input_dim, variance=1., lengthscale=None, ARD=False, name='rbf'): 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.input_dim = input_dim
self.name = name self.name = name
self.ARD = ARD self.ARD = ARD
self.variance = variance
if not ARD: if not ARD:
self.num_params = 2 self.num_params = 2
if lengthscale is not None: if lengthscale is not None:
@ -53,15 +54,21 @@ class RBF(Kernpart):
lengthscale = np.ones(self.input_dim) lengthscale = np.ones(self.input_dim)
#self._set_params(np.hstack((variance, lengthscale.flatten()))) #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 # initialize cache
self._Z, self._mu, self._S = np.empty(shape=(3, 1)) self._Z, self._mu, self._S = np.empty(shape=(3, 1))
self._X, self._X2, self._params_save = 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 # a set of optional args to pass to weave
self.weave_options = {'headers' : ['<omp.h>'], self.weave_options = {'headers' : ['<omp.h>'],
'extra_compile_args': ['-fopenmp -O3'], # -march=native'], 'extra_compile_args': ['-fopenmp -O3'], # -march=native'],
'extra_link_args' : ['-lgomp']} 'extra_link_args' : ['-lgomp']}
def parameters_changed(self): def parameters_changed(self):
self.lengthscale2 = np.square(self.lengthscale) 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._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._Z, self._mu, self._S = np.empty(shape=(3, 1)) # cached versions of Z,mu,S
# def _get_params(self): def _get_params(self):
# return np.hstack((self.variance, self.lengthscale)) return np.hstack((self.variance, self.lengthscale))
# #
# def _set_params(self, x): def _set_params(self, x):
# assert x.size == (self.num_params) assert x.size == (self.num_params)
# self.variance = x[0] #self.variance = x[0]
# self.lengthscale = x[1:] #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): #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, target):
pass pass
def K(self, X, X2, target): def K(self, X, X2, target):

View file

@ -14,10 +14,13 @@ class White(Kernpart):
:type variance: float :type variance: float
""" """
def __init__(self,input_dim,variance=1.): def __init__(self,input_dim,variance=1.):
super(White, self).__init__(input_dim)
self.input_dim = input_dim self.input_dim = input_dim
self.num_params = 1 self.num_params = 1
self.name = 'white' 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 self._psi1 = 0 # TODO: more elegance here
def _get_params(self): def _get_params(self):