mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-06-02 14:45:15 +02:00
Merge branch 'devel' of https://github.com/SheffieldML/GPy into devel
This commit is contained in:
commit
b2cea56c11
14 changed files with 38 additions and 30 deletions
|
|
@ -126,7 +126,7 @@ class FITC(SparseGP):
|
||||||
self._dpsi1_dX += self.kern.dK_dX(_dpsi1.T,self.Z,self.X[i:i+1,:])
|
self._dpsi1_dX += self.kern.dK_dX(_dpsi1.T,self.Z,self.X[i:i+1,:])
|
||||||
|
|
||||||
# the partial derivative vector for the likelihood
|
# the partial derivative vector for the likelihood
|
||||||
if self.likelihood.Nparams == 0:
|
if self.likelihood.num_params == 0:
|
||||||
# save computation here.
|
# save computation here.
|
||||||
self.partial_for_likelihood = None
|
self.partial_for_likelihood = None
|
||||||
elif self.likelihood.is_heteroscedastic:
|
elif self.likelihood.is_heteroscedastic:
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,7 @@ class SparseGP(GPBase):
|
||||||
|
|
||||||
|
|
||||||
# the partial derivative vector for the likelihood
|
# the partial derivative vector for the likelihood
|
||||||
if self.likelihood.Nparams == 0:
|
if self.likelihood.num_params == 0:
|
||||||
# save computation here.
|
# save computation here.
|
||||||
self.partial_for_likelihood = None
|
self.partial_for_likelihood = None
|
||||||
elif self.likelihood.is_heteroscedastic:
|
elif self.likelihood.is_heteroscedastic:
|
||||||
|
|
|
||||||
|
|
@ -350,8 +350,8 @@ class SVIGP(GPBase):
|
||||||
|
|
||||||
#callback
|
#callback
|
||||||
if i and not i%callback_interval:
|
if i and not i%callback_interval:
|
||||||
callback()
|
callback(self) # Change this to callback()
|
||||||
time.sleep(0.1)
|
time.sleep(0.01)
|
||||||
|
|
||||||
if self.epochs > 10:
|
if self.epochs > 10:
|
||||||
self._adapt_steplength()
|
self._adapt_steplength()
|
||||||
|
|
@ -367,13 +367,13 @@ class SVIGP(GPBase):
|
||||||
assert self.vb_steplength > 0
|
assert self.vb_steplength > 0
|
||||||
|
|
||||||
if self.adapt_param_steplength:
|
if self.adapt_param_steplength:
|
||||||
# self._adaptive_param_steplength()
|
self._adaptive_param_steplength()
|
||||||
# self._adaptive_param_steplength_log()
|
# self._adaptive_param_steplength_log()
|
||||||
self._adaptive_param_steplength_from_vb()
|
# self._adaptive_param_steplength_from_vb()
|
||||||
self._param_steplength_trace.append(self.param_steplength)
|
self._param_steplength_trace.append(self.param_steplength)
|
||||||
|
|
||||||
def _adaptive_param_steplength(self):
|
def _adaptive_param_steplength(self):
|
||||||
decr_factor = 0.1
|
decr_factor = 0.02
|
||||||
g_tp = self._transform_gradients(self._log_likelihood_gradients())
|
g_tp = self._transform_gradients(self._log_likelihood_gradients())
|
||||||
self.gbar_tp = (1-1/self.tau_tp)*self.gbar_tp + 1/self.tau_tp * g_tp
|
self.gbar_tp = (1-1/self.tau_tp)*self.gbar_tp + 1/self.tau_tp * g_tp
|
||||||
self.hbar_tp = (1-1/self.tau_tp)*self.hbar_tp + 1/self.tau_tp * np.dot(g_tp.T, g_tp)
|
self.hbar_tp = (1-1/self.tau_tp)*self.hbar_tp + 1/self.tau_tp * np.dot(g_tp.T, g_tp)
|
||||||
|
|
@ -407,7 +407,7 @@ class SVIGP(GPBase):
|
||||||
self.tau_t = self.tau_t*(1-self.vb_steplength) + 1
|
self.tau_t = self.tau_t*(1-self.vb_steplength) + 1
|
||||||
|
|
||||||
def _adaptive_vb_steplength_KL(self):
|
def _adaptive_vb_steplength_KL(self):
|
||||||
decr_factor = 1 #0.1
|
decr_factor = 0.1
|
||||||
natgrad = self.vb_grad_natgrad()
|
natgrad = self.vb_grad_natgrad()
|
||||||
g_t1 = natgrad[0]
|
g_t1 = natgrad[0]
|
||||||
g_t2 = natgrad[1]
|
g_t2 = natgrad[1]
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ class kern(Parameterized):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
self.parts = parts
|
self.parts = parts
|
||||||
self.Nparts = len(parts)
|
self.num_parts = len(parts)
|
||||||
self.num_params = sum([p.num_params for p in self.parts])
|
self.num_params = sum([p.num_params for p in self.parts])
|
||||||
|
|
||||||
self.input_dim = input_dim
|
self.input_dim = input_dim
|
||||||
|
|
@ -61,7 +61,7 @@ class kern(Parameterized):
|
||||||
here just all the indices, rest can get recomputed
|
here just all the indices, rest can get recomputed
|
||||||
"""
|
"""
|
||||||
return Parameterized.getstate(self) + [self.parts,
|
return Parameterized.getstate(self) + [self.parts,
|
||||||
self.Nparts,
|
self.num_parts,
|
||||||
self.num_params,
|
self.num_params,
|
||||||
self.input_dim,
|
self.input_dim,
|
||||||
self.input_slices,
|
self.input_slices,
|
||||||
|
|
@ -73,7 +73,7 @@ class kern(Parameterized):
|
||||||
self.input_slices = state.pop()
|
self.input_slices = state.pop()
|
||||||
self.input_dim = state.pop()
|
self.input_dim = state.pop()
|
||||||
self.num_params = state.pop()
|
self.num_params = state.pop()
|
||||||
self.Nparts = state.pop()
|
self.num_parts = state.pop()
|
||||||
self.parts = state.pop()
|
self.parts = state.pop()
|
||||||
Parameterized.setstate(self, state)
|
Parameterized.setstate(self, state)
|
||||||
|
|
||||||
|
|
@ -308,7 +308,7 @@ class kern(Parameterized):
|
||||||
|
|
||||||
def K(self, X, X2=None, which_parts='all'):
|
def K(self, X, X2=None, which_parts='all'):
|
||||||
if which_parts == 'all':
|
if which_parts == 'all':
|
||||||
which_parts = [True] * self.Nparts
|
which_parts = [True] * self.num_parts
|
||||||
assert X.shape[1] == self.input_dim
|
assert X.shape[1] == self.input_dim
|
||||||
if X2 is None:
|
if X2 is None:
|
||||||
target = np.zeros((X.shape[0], X.shape[0]))
|
target = np.zeros((X.shape[0], X.shape[0]))
|
||||||
|
|
@ -359,7 +359,7 @@ class kern(Parameterized):
|
||||||
def Kdiag(self, X, which_parts='all'):
|
def Kdiag(self, X, which_parts='all'):
|
||||||
"""Compute the diagonal of the covariance function for inputs X."""
|
"""Compute the diagonal of the covariance function for inputs X."""
|
||||||
if which_parts == 'all':
|
if which_parts == 'all':
|
||||||
which_parts = [True] * self.Nparts
|
which_parts = [True] * self.num_parts
|
||||||
assert X.shape[1] == self.input_dim
|
assert X.shape[1] == self.input_dim
|
||||||
target = np.zeros(X.shape[0])
|
target = np.zeros(X.shape[0])
|
||||||
[p.Kdiag(X[:, i_s], target=target) for p, i_s, part_on in zip(self.parts, self.input_slices, which_parts) if part_on]
|
[p.Kdiag(X[:, i_s], target=target) for p, i_s, part_on in zip(self.parts, self.input_slices, which_parts) if part_on]
|
||||||
|
|
@ -497,7 +497,7 @@ class kern(Parameterized):
|
||||||
|
|
||||||
def plot(self, x=None, plot_limits=None, which_parts='all', resolution=None, *args, **kwargs):
|
def plot(self, x=None, plot_limits=None, which_parts='all', resolution=None, *args, **kwargs):
|
||||||
if which_parts == 'all':
|
if which_parts == 'all':
|
||||||
which_parts = [True] * self.Nparts
|
which_parts = [True] * self.num_parts
|
||||||
if self.input_dim == 1:
|
if self.input_dim == 1:
|
||||||
if x is None:
|
if x is None:
|
||||||
x = np.zeros((1, 1))
|
x = np.zeros((1, 1))
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ class PeriodicMatern32(Kernpart):
|
||||||
|
|
||||||
@silence_errors
|
@silence_errors
|
||||||
def dK_dtheta(self,dL_dK,X,X2,target):
|
def dK_dtheta(self,dL_dK,X,X2,target):
|
||||||
"""derivative of the covariance matrix with respect to the parameters (shape is Nxnum_inducingxNparam)"""
|
"""derivative of the covariance matrix with respect to the parameters (shape is num_data x num_inducing x num_params)"""
|
||||||
if X2 is None: X2 = X
|
if X2 is None: X2 = X
|
||||||
FX = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X)
|
FX = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X)
|
||||||
FX2 = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X2)
|
FX2 = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X2)
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,7 @@ class PeriodicMatern52(Kernpart):
|
||||||
|
|
||||||
@silence_errors
|
@silence_errors
|
||||||
def dK_dtheta(self,dL_dK,X,X2,target):
|
def dK_dtheta(self,dL_dK,X,X2,target):
|
||||||
"""derivative of the covariance matrix with respect to the parameters (shape is Nxnum_inducingxNparam)"""
|
"""derivative of the covariance matrix with respect to the parameters (shape is num_data x num_inducing x num_params)"""
|
||||||
if X2 is None: X2 = X
|
if X2 is None: X2 = X
|
||||||
FX = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X)
|
FX = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X)
|
||||||
FX2 = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X2)
|
FX2 = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X2)
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ class PeriodicExponential(Kernpart):
|
||||||
|
|
||||||
@silence_errors
|
@silence_errors
|
||||||
def dK_dtheta(self,dL_dK,X,X2,target):
|
def dK_dtheta(self,dL_dK,X,X2,target):
|
||||||
"""derivative of the covariance matrix with respect to the parameters (shape is Nxnum_inducingxNparam)"""
|
"""derivative of the covariance matrix with respect to the parameters (shape is N x num_inducing x num_params)"""
|
||||||
if X2 is None: X2 = X
|
if X2 is None: X2 = X
|
||||||
FX = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X)
|
FX = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X)
|
||||||
FX2 = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X2)
|
FX2 = self._cos(self.basis_alpha[None,:],self.basis_omega[None,:],self.basis_phi[None,:])(X2)
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ class EP(likelihood):
|
||||||
self.data = data
|
self.data = data
|
||||||
self.num_data, self.output_dim = self.data.shape
|
self.num_data, self.output_dim = self.data.shape
|
||||||
self.is_heteroscedastic = True
|
self.is_heteroscedastic = True
|
||||||
self.Nparams = 0
|
self.num_params = 0
|
||||||
self._transf_data = self.noise_model._preprocess_values(data)
|
self._transf_data = self.noise_model._preprocess_values(data)
|
||||||
|
|
||||||
#Initial values - Likelihood approximation parameters:
|
#Initial values - Likelihood approximation parameters:
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ class EP_Mixed_Noise(likelihood):
|
||||||
self.data = np.vstack(data_list)
|
self.data = np.vstack(data_list)
|
||||||
self.N, self.output_dim = self.data.shape
|
self.N, self.output_dim = self.data.shape
|
||||||
self.is_heteroscedastic = True
|
self.is_heteroscedastic = True
|
||||||
self.Nparams = 0#FIXME
|
self.num_params = 0#FIXME
|
||||||
self._transf_data = np.vstack([noise_model._preprocess_values(data) for noise_model,data in zip(noise_model_list,data_list)])
|
self._transf_data = np.vstack([noise_model._preprocess_values(data) for noise_model,data in zip(noise_model_list,data_list)])
|
||||||
#TODO non-gaussian index
|
#TODO non-gaussian index
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ class Gaussian(likelihood):
|
||||||
"""
|
"""
|
||||||
def __init__(self, data, variance=1., normalize=False):
|
def __init__(self, data, variance=1., normalize=False):
|
||||||
self.is_heteroscedastic = False
|
self.is_heteroscedastic = False
|
||||||
self.Nparams = 1
|
self.num_params = 1
|
||||||
self.Z = 0. # a correction factor which accounts for the approximation made
|
self.Z = 0. # a correction factor which accounts for the approximation made
|
||||||
N, self.output_dim = data.shape
|
N, self.output_dim = data.shape
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,14 @@ class Gaussian_Mixed_Noise(likelihood):
|
||||||
:type normalize: False|True
|
:type normalize: False|True
|
||||||
"""
|
"""
|
||||||
def __init__(self, data_list, noise_params=None, normalize=True):
|
def __init__(self, data_list, noise_params=None, normalize=True):
|
||||||
self.Nparams = len(data_list)
|
self.num_params = len(data_list)
|
||||||
self.n_list = [data.size for data in data_list]
|
self.n_list = [data.size for data in data_list]
|
||||||
self.index = np.vstack([np.repeat(i,n)[:,None] for i,n in zip(range(self.Nparams),self.n_list)])
|
self.index = np.vstack([np.repeat(i,n)[:,None] for i,n in zip(range(self.num_params),self.n_list)])
|
||||||
|
|
||||||
if noise_params is None:
|
if noise_params is None:
|
||||||
noise_params = [1.] * self.Nparams
|
noise_params = [1.] * self.num_params
|
||||||
else:
|
else:
|
||||||
assert self.Nparams == len(noise_params), 'Number of noise parameters does not match the number of noise models.'
|
assert self.num_params == len(noise_params), 'Number of noise parameters does not match the number of noise models.'
|
||||||
|
|
||||||
self.noise_model_list = [Gaussian(Y,variance=v,normalize = normalize) for Y,v in zip(data_list,noise_params)]
|
self.noise_model_list = [Gaussian(Y,variance=v,normalize = normalize) for Y,v in zip(data_list,noise_params)]
|
||||||
self.n_params = [noise_model._get_params().size for noise_model in self.noise_model_list]
|
self.n_params = [noise_model._get_params().size for noise_model in self.noise_model_list]
|
||||||
|
|
|
||||||
|
|
@ -211,8 +211,8 @@ class MRD(Model):
|
||||||
# g.Z = Z.reshape(self.num_inducing, self.input_dim)
|
# g.Z = Z.reshape(self.num_inducing, self.input_dim)
|
||||||
#
|
#
|
||||||
# def _set_kern_params(self, g, p):
|
# def _set_kern_params(self, g, p):
|
||||||
# g.kern._set_params(p[:g.kern.Nparam])
|
# g.kern._set_params(p[:g.kern.num_params])
|
||||||
# g.likelihood._set_params(p[g.kern.Nparam:])
|
# g.likelihood._set_params(p[g.kern.num_params:])
|
||||||
|
|
||||||
def _set_params(self, x):
|
def _set_params(self, x):
|
||||||
start = 0; end = self.NQ
|
start = 0; end = self.NQ
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ class SVIGPRegression(SVIGP):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, X, Y, kernel=None, Z=None, num_inducing=10, q_u=None, batchsize=10):
|
def __init__(self, X, Y, kernel=None, Z=None, num_inducing=10, q_u=None, batchsize=10, normalize_Y=False):
|
||||||
# kern defaults to rbf (plus white for stability)
|
# kern defaults to rbf (plus white for stability)
|
||||||
if kernel is None:
|
if kernel is None:
|
||||||
kernel = kern.rbf(X.shape[1], variance=1., lengthscale=4.) + kern.white(X.shape[1], 1e-3)
|
kernel = kern.rbf(X.shape[1], variance=1., lengthscale=4.) + kern.white(X.shape[1], 1e-3)
|
||||||
|
|
@ -38,7 +38,7 @@ class SVIGPRegression(SVIGP):
|
||||||
assert Z.shape[1] == X.shape[1]
|
assert Z.shape[1] == X.shape[1]
|
||||||
|
|
||||||
# likelihood defaults to Gaussian
|
# likelihood defaults to Gaussian
|
||||||
likelihood = likelihoods.Gaussian(Y, normalize=False)
|
likelihood = likelihoods.Gaussian(Y, normalize=normalize_Y)
|
||||||
|
|
||||||
SVIGP.__init__(self, X, likelihood, kernel, Z, q_u=q_u, batchsize=batchsize)
|
SVIGP.__init__(self, X, likelihood, kernel, Z, q_u=q_u, batchsize=batchsize)
|
||||||
self.load_batch()
|
self.load_batch()
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,13 @@ import GPy
|
||||||
|
|
||||||
verbose = False
|
verbose = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
import sympy
|
||||||
|
SYMPY_AVAILABLE=True
|
||||||
|
except ImportError:
|
||||||
|
SYMPY_AVAILABLE=False
|
||||||
|
|
||||||
|
|
||||||
class KernelTests(unittest.TestCase):
|
class KernelTests(unittest.TestCase):
|
||||||
def test_kerneltie(self):
|
def test_kerneltie(self):
|
||||||
K = GPy.kern.rbf(5, ARD=True)
|
K = GPy.kern.rbf(5, ARD=True)
|
||||||
|
|
@ -22,6 +29,7 @@ class KernelTests(unittest.TestCase):
|
||||||
self.assertTrue(GPy.kern.kern_test(kern, verbose=verbose))
|
self.assertTrue(GPy.kern.kern_test(kern, verbose=verbose))
|
||||||
|
|
||||||
def test_rbf_sympykernel(self):
|
def test_rbf_sympykernel(self):
|
||||||
|
if SYMPY_AVAILABLE:
|
||||||
kern = GPy.kern.rbf_sympy(5)
|
kern = GPy.kern.rbf_sympy(5)
|
||||||
self.assertTrue(GPy.kern.kern_test(kern, verbose=verbose))
|
self.assertTrue(GPy.kern.kern_test(kern, verbose=verbose))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue