minor changes

This commit is contained in:
Ricardo 2014-02-03 15:29:06 +00:00
parent a99537d3cc
commit f50fac8104
3 changed files with 19 additions and 18 deletions

View file

@ -411,7 +411,7 @@ def periodic_Matern52(input_dim, variance=1., lengthscale=None, period=2 * np.pi
part = parts.periodic_Matern52.PeriodicMatern52(input_dim, variance, lengthscale, period, n_freq, lower, upper) part = parts.periodic_Matern52.PeriodicMatern52(input_dim, variance, lengthscale, period, n_freq, lower, upper)
return kern(input_dim, [part]) return kern(input_dim, [part])
def prod(k1,k2,tensor=False): def prod(k1,k2,**kwargs):
""" """
Construct a product kernel over input_dim from two kernels over input_dim Construct a product kernel over input_dim from two kernels over input_dim
@ -422,7 +422,7 @@ def prod(k1,k2,tensor=False):
:rtype: kernel object :rtype: kernel object
""" """
part = parts.prod.Prod(k1, k2, tensor) part = parts.prod.Prod(k1, k2, **kwargs)
return kern(part.input_dim, [part]) return kern(part.input_dim, [part])
def symmetric(k): def symmetric(k):
@ -433,7 +433,7 @@ def symmetric(k):
k_.parts = [symmetric.Symmetric(p) for p in k.parts] k_.parts = [symmetric.Symmetric(p) for p in k.parts]
return k_ return k_
def coregionalize(output_dim,rank=1, W=None, kappa=None): def coregionalize(output_dim,rank=1, W=None, kappa=None,name='coregion'):
""" """
Coregionlization matrix B, of the form: Coregionlization matrix B, of the form:
@ -458,7 +458,7 @@ def coregionalize(output_dim,rank=1, W=None, kappa=None):
:rtype: kernel object :rtype: kernel object
""" """
p = parts.coregionalize.Coregionalize(output_dim,rank,W,kappa) p = parts.coregionalize.Coregionalize(output_dim,rank,W,kappa,name)
return kern(1,[p]) return kern(1,[p])

View file

@ -170,7 +170,7 @@ class kern(Parameterized):
""" """
return self.prod(other, tensor=True) return self.prod(other, tensor=True)
def prod(self, other, tensor=False): def prod(self, other, tensor=False, **kwargs):
""" """
Multiply two kernels (either on the same space, or on the tensor product of the input space). Multiply two kernels (either on the same space, or on the tensor product of the input space).
@ -189,7 +189,7 @@ class kern(Parameterized):
s1[sl1], s2[sl2] = [True], [True] s1[sl1], s2[sl2] = [True], [True]
slices += [s1 + s2] slices += [s1 + s2]
newkernparts = [prod(k1, k2, tensor) for k1, k2 in itertools.product(K1._parameters_, K2._parameters_)] newkernparts = [prod(k1, k2, tensor, **kwargs) for k1, k2 in itertools.product(K1._parameters_, K2._parameters_)]
if tensor: if tensor:
newkern = kern(K1.input_dim + K2.input_dim, newkernparts, slices) newkern = kern(K1.input_dim + K2.input_dim, newkernparts, slices)

View file

@ -17,21 +17,21 @@ class Prod(Kernpart):
:rtype: kernel object :rtype: kernel object
""" """
def __init__(self,k1,k2,tensor=False): def __init__(self,k1,k2,tensor=False,name="product"):
if tensor: if tensor:
super(Prod, self).__init__(k1.input_dim + k2.input_dim, '['+k1.name + '**' + k2.name +']') super(Prod, self).__init__(k1.input_dim + k2.input_dim, name)
else: else:
assert k1.input_dim == k2.input_dim, "Error: The input spaces of the kernels to sum don't have the same dimension." assert k1.input_dim == k2.input_dim, "Error: The input spaces of the kernels to sum don't have the same dimension."
super(Prod, self).__init__(k1.input_dim, '['+k1.name + '*' + k2.name +']') super(Prod, self).__init__(k1.input_dim, name)
#self.num_params = k1.num_params + k2.num_params #self.num_params = k1.num_params + k2.num_params
self.k1 = k1 self.k1 = k1
self.k2 = k2 self.k2 = k2
# if tensor: if tensor:
# self.slice1 = slice(0,self.k1.input_dim) self.slice1 = slice(0,self.k1.input_dim)
# self.slice2 = slice(self.k1.input_dim,self.k1.input_dim+self.k2.input_dim) self.slice2 = slice(self.k1.input_dim,self.k1.input_dim+self.k2.input_dim)
# else: else:
# self.slice1 = slice(0,self.input_dim) self.slice1 = slice(0,self.input_dim)
# self.slice2 = slice(0,self.input_dim) self.slice2 = slice(0,self.input_dim)
self._X, self._X2 = np.empty(shape=(2,1)) self._X, self._X2 = np.empty(shape=(2,1))
self.add_parameters(self.k1, self.k2) self.add_parameters(self.k1, self.k2)
@ -117,18 +117,19 @@ class Prod(Kernpart):
def _K_computations(self,X,X2): def _K_computations(self,X,X2):
if not (np.array_equal(X,self._X) and np.array_equal(X2,self._X2) and np.array_equal(self._params , self._get_params())): if not (np.array_equal(X,self._X) and np.array_equal(X2,self._X2) and np.array_equal(self._params , self._get_params())):
self._X = X.copy() #self._X = X.copy()
self._params == self._get_params().copy() #self._params == self._get_params().copy()
if X2 is None: if X2 is None:
self._X2 = None self._X2 = None
self._K1 = np.zeros((X.shape[0],X.shape[0])) self._K1 = np.zeros((X.shape[0],X.shape[0]))
self._K2 = np.zeros((X.shape[0],X.shape[0])) self._K2 = np.zeros((X.shape[0],X.shape[0]))
self.k1.K(X[:,self.slice1],None,self._K1) self.k1.K(X[:,self.slice1],None,self._K1)
self.k2.K(X[:,self.slice2],None,self._K2) self.k2.K(X[:,self.slice2],None,self._K2)
#self.k1.K(X[:,self.k1.input_slices],None,self._K1)
#self.k2.K(X[:,self.k2_input_slices],None,self._K2)
else: else:
self._X2 = X2.copy() self._X2 = X2.copy()
self._K1 = np.zeros((X.shape[0],X2.shape[0])) self._K1 = np.zeros((X.shape[0],X2.shape[0]))
self._K2 = np.zeros((X.shape[0],X2.shape[0])) self._K2 = np.zeros((X.shape[0],X2.shape[0]))
self.k1.K(X[:,self.slice1],X2[:,self.slice1],self._K1) self.k1.K(X[:,self.slice1],X2[:,self.slice1],self._K1)
self.k2.K(X[:,self.slice2],X2[:,self.slice2],self._K2) self.k2.K(X[:,self.slice2],X2[:,self.slice2],self._K2)