diff --git a/GPy/kern/constructors.py b/GPy/kern/constructors.py index 392f43ba..b60c7479 100644 --- a/GPy/kern/constructors.py +++ b/GPy/kern/constructors.py @@ -450,6 +450,18 @@ def prod(k1,k2,tensor=False): def symmetric(k): """ Construct a symmetric kernel from an existing kernel + + The symmetric kernel works by adding two GP functions together, and computing the overall covariance. + + Let f ~ GP(x | 0, k(x, x')). Now let g = f(x) + f(-x). + + It's easy to see that g is a symmetric function: g(x) = g(-x). + + by construction, g, is a gaussian Process with mean 0 and covariance + + k(x, x') + k(-x, x') + k(x, -x') + k(-x, -x') + + This constructor builds a covariance function of this form from the initial kernel """ k_ = k.copy() k_.parts = [symmetric.Symmetric(p) for p in k.parts] diff --git a/GPy/kern/parts/prod.py b/GPy/kern/parts/prod.py index 7441ae9f..f517262c 100644 --- a/GPy/kern/parts/prod.py +++ b/GPy/kern/parts/prod.py @@ -133,12 +133,12 @@ class Prod(Kernpart): self.k1.K(X[:,self.slice1],X2[:,self.slice1],self._K1) self.k2.K(X[:,self.slice2],X2[:,self.slice2],self._K2) - def __getstate__(self): - return [self.k1, self.k2, self.slice1, self.slice2, self.name, self.input_dim, self.num_params] + #def __getstate__(self): + #return [self.k1, self.k2, self.slice1, self.slice2, self.name, self.input_dim, self.num_params] - def __setstate__(self, state): - self.k1, self.k2, self.slice1, self.slice2, self.name, self.input_dim, self.num_params = state - self._X, self._X2, self._params = np.empty(shape=(3,1)) + #def __setstate__(self, state): + #self.k1, self.k2, self.slice1, self.slice2, self.name, self.input_dim, self.num_params = state + #self._X, self._X2, self._params = np.empty(shape=(3,1))