diff --git a/GPy/__init__.py b/GPy/__init__.py index 876e2ca6..9e370489 100644 --- a/GPy/__init__.py +++ b/GPy/__init__.py @@ -6,5 +6,5 @@ import kern import models import inference import util -import examples +#import examples from core import priors diff --git a/GPy/core/model.py b/GPy/core/model.py index 9b373030..ab4f8246 100644 --- a/GPy/core/model.py +++ b/GPy/core/model.py @@ -9,7 +9,7 @@ import sys, pdb from parameterised import parameterised, truncate_pad import priors from ..util.linalg import jitchol -from ..inference import optimization, SGD +from ..inference import optimization class model(parameterised): def __init__(self): diff --git a/GPy/examples/GP_regression_demo.py b/GPy/examples/GP_regression_demo.py index d1a4193a..0fe2fabd 100644 --- a/GPy/examples/GP_regression_demo.py +++ b/GPy/examples/GP_regression_demo.py @@ -19,18 +19,14 @@ pb.close('all') X = np.random.uniform(-3.,3.,(20,1)) Y = np.sin(X)+np.random.randn(20,1)*0.05 -# construct kernel -rbf = GPy.kern.rbf(1) -noise = GPy.kern.white(1) -kernel = rbf + noise - # create simple GP model -m = GPy.models.GP_regression(X,Y, kernel=kernel) +m = GPy.models.GP_regression(X,Y) # contrain all parameters to be positive m.constrain_positive('') + # optimize and plot -m.optimize('rasm', max_f_eval = 1000) +m.optimize('tnc', max_f_eval = 1000) m.plot() print(m) @@ -41,11 +37,6 @@ print(m) X = np.random.uniform(-3.,3.,(40,2)) Y = np.sin(X[:,0:1]) * np.sin(X[:,1:2])+np.random.randn(40,1)*0.05 -# construct kernel -rbf = GPy.kern.rbf(2) -noise = GPy.kern.white(2) -kernel = rbf + noise - # create simple GP model m = GPy.models.GP_regression(X,Y) @@ -53,7 +44,7 @@ m = GPy.models.GP_regression(X,Y) m.constrain_positive('') # optimize and plot pb.figure() -m.optimize('rasm', max_f_eval = 1000) +m.optimize('tnc', max_f_eval = 1000) m.plot() print(m) diff --git a/GPy/kern/kern.py b/GPy/kern/kern.py index f19a4685..cb2ef197 100644 --- a/GPy/kern/kern.py +++ b/GPy/kern/kern.py @@ -166,8 +166,8 @@ class kern(parameterised): slices1, slices2 = self._process_slices(slices1,slices2) if X2 is None: X2 = X - target = np.zeros((X.shape[0],X2.shape[0],self.Nparam)) - [p.dK_dtheta(X[s1,i_s],X2[s2,i_s],target[s1,s2,ps]) for p,i_s,ps,s1,s2 in zip(self.parts, self.input_slices, self.param_slices, slices1, slices2)] + target = np.zeros(self.Nparam) + [p.dK_dtheta(partial,X[s1,i_s],X2[s2,i_s],target[ps]) for p,i_s,ps,s1,s2 in zip(self.parts, self.input_slices, self.param_slices, slices1, slices2)] return target def dK_dX(self,X,X2=None,slices1=None,slices2=None): @@ -185,11 +185,13 @@ class kern(parameterised): [p.Kdiag(X[s,i_s],target=target[s]) for p,i_s,s in zip(self.parts,self.input_slices,slices)] return target - def dKdiag_dtheta(self,X,slices=None): + def dKdiag_dtheta(self,partial,X,slices=None): assert X.shape[1]==self.D + assert len(partial.shape)==1 + assert partial.size==X.shape[0] slices = self._process_slices(slices,False) - target = np.zeros((X.shape[0],self.Nparam)) - [p.dKdiag_dtheta(X[s,i_s],target[s,ps]) for p,i_s,s,ps in zip(self.parts,self.input_slices,slices,self.param_slices)] + target = np.zeros(self.Nparam) + [p.dKdiag_dtheta(partial,X[s,i_s],target[ps]) for p,i_s,s,ps in zip(self.parts,self.input_slices,slices,self.param_slices)] return target def dKdiag_dX(self, X, slices=None): diff --git a/GPy/kern/rbf.py b/GPy/kern/rbf.py index 70ec06f4..1a8dedd1 100644 --- a/GPy/kern/rbf.py +++ b/GPy/kern/rbf.py @@ -50,14 +50,13 @@ class rbf(kernpart): def Kdiag(self,X,target): np.add(target,self.variance,target) - def dK_dtheta(self,X,X2,target): - """Return shape is NxMx(Ntheta)""" + def dK_dtheta(self,partial,X,X2,target): self._K_computations(X,X2) - target[:,:,0] += self._K_dvar - target[:,:,1] += self._K_dvar*self.variance*self._K_dist2/self.lengthscale + target[0] += np.sum(self._K_dvar*partial) + target[1] += np.sum(self._K_dvar*self.variance*self._K_dist2/self.lengthscale*partial) def dKdiag_dtheta(self,X,target): - np.add(target[:,0],1.,target[:,0]) + target[0] += partial def dK_dX(self,X,X2,target): self._K_computations(X,X2) diff --git a/GPy/kern/white.py b/GPy/kern/white.py index a882832a..1215e101 100644 --- a/GPy/kern/white.py +++ b/GPy/kern/white.py @@ -37,10 +37,10 @@ class white(kernpart): def Kdiag(self,X,target): target += self.variance - def dK_dtheta(self,X,X2,target): + def dK_dtheta(self,partial,X,X2,target): if X.shape==X2.shape: if np.all(X==X2): - np.add(target[:,:,0],np.eye(X.shape[0]),target[:,:,0]) + target += np.trace(partial) def dKdiag_dtheta(self,X,target): np.add(target[:,0],1.,target[:,0]) @@ -50,7 +50,7 @@ class white(kernpart): def dKdiag_dX(self,X,target): pass - + def psi0(self,Z,mu,S,target): target += self.variance diff --git a/GPy/models/GP_EP.py b/GPy/models/GP_EP.py index dec9a349..eb85b331 100644 --- a/GPy/models/GP_EP.py +++ b/GPy/models/GP_EP.py @@ -7,7 +7,7 @@ import pylab as pb from scipy import stats, linalg from .. import kern from ..inference.Expectation_Propagation import EP,Full -from ..inference.likelihoods import likelihood,probit,poisson,gaussian +from ..inference.likelihoods import likelihood,probit#,poisson,gaussian from ..core import model from ..util.linalg import pdinv,jitchol from ..util.plot import gpplot diff --git a/GPy/models/GP_regression.py b/GPy/models/GP_regression.py index 614a10e6..b6959448 100644 --- a/GPy/models/GP_regression.py +++ b/GPy/models/GP_regression.py @@ -29,7 +29,7 @@ class GP_regression(model): def __init__(self,X,Y,kernel=None,normalize_X=False,normalize_Y=False, Xslices=None): if kernel is None: - kernel = kern.rbf(X.shape[1]) + kern.bias(X.shape[1]) + kern.white(X.shape[1]) + kernel = kern.rbf(X.shape[1]) + kern.white(X.shape[1]) # parse arguments self.Xslices = Xslices @@ -103,7 +103,7 @@ class GP_regression(model): return dL_dK def log_likelihood_gradients(self): - return self.kern.dK_dtheta(self.X,partial=self.dL_dK()) + return self.kern.dK_dtheta(partial=self.dL_dK(),X=self.X) def predict(self,Xnew, slices=None): """ diff --git a/GPy/models/__init__.py b/GPy/models/__init__.py index 48b0ba57..dd721559 100644 --- a/GPy/models/__init__.py +++ b/GPy/models/__init__.py @@ -6,6 +6,6 @@ from GP_regression import GP_regression from sparse_GP_regression import sparse_GP_regression from GPLVM import GPLVM from warped_GP import warpedGP -from simple_GP_EP import GP_EP +from GP_EP import GP_EP from generalized_FITC import generalized_FITC from sparse_GPLVM import sparse_GPLVM diff --git a/GPy/models/generalized_FITC.py b/GPy/models/generalized_FITC.py index 0552c867..b4953ecb 100644 --- a/GPy/models/generalized_FITC.py +++ b/GPy/models/generalized_FITC.py @@ -9,7 +9,7 @@ from .. import kern from ..core import model from ..util.linalg import pdinv,mdot from ..util.plot import gpplot -from ..inference.Expectation_Propagation import EP,Full,DTC,FITC +from ..inference.Expectation_Propagation import EP,Full,FITC from ..inference.likelihoods import likelihood,probit class generalized_FITC(model): @@ -17,14 +17,12 @@ class generalized_FITC(model): """ Naish-Guzman, A. and Holden, S. (2008) implemantation of EP with FITC. - Arguments - --------- - X : input observations - likelihood : Output's likelihood (likelihood class) - kernel : a GPy kernel - inducing : Either an array specifying the inducing points location or a scalar defining their number. - epsilon_ep : EP convergence criterion, maximum squared difference allowed between mean updates to stop iterations (float) - powerep : Power-EP parameters (eta,delta) - 2x1 numpy array (floats) + :param X: input observations + :param likelihood: Output's likelihood (likelihood class) + :param kernel: a GPy kernel + :param inducing: Either an array specifying the inducing points location or a scalar defining their number. + :param epsilon_ep: EP convergence criterion, maximum squared difference allowed between mean updates to stop iterations (float) + :param powerep: Power-EP parameters (eta,delta) - 2x1 numpy array (floats) """ assert isinstance(kernel,kern.kern) self.likelihood = likelihood