mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-15 06:52:39 +02:00
some work on ep, and some messing with wher ethe derivatives are computed (in the model, not the inference
This commit is contained in:
parent
b6edc1a298
commit
0cf1e44c68
4 changed files with 40 additions and 5 deletions
|
|
@ -70,7 +70,7 @@ class GP(Model):
|
||||||
|
|
||||||
def parameters_changed(self):
|
def parameters_changed(self):
|
||||||
self.posterior, self._log_marginal_likelihood, grad_dict = self.inference_method.inference(self.kern, self.X, self.likelihood, self.Y, Y_metadata=self.Y_metadata)
|
self.posterior, self._log_marginal_likelihood, grad_dict = self.inference_method.inference(self.kern, self.X, self.likelihood, self.Y, Y_metadata=self.Y_metadata)
|
||||||
self._dL_dK = grad_dict['dL_dK']
|
self.kern.update_gradients_full(grad_dict['dL_dK'])
|
||||||
|
|
||||||
def log_likelihood(self):
|
def log_likelihood(self):
|
||||||
return self._log_marginal_likelihood
|
return self._log_marginal_likelihood
|
||||||
|
|
|
||||||
|
|
@ -23,11 +23,26 @@ class EP(object):
|
||||||
self.old_mutilde, self.old_vtilde = None, None
|
self.old_mutilde, self.old_vtilde = None, None
|
||||||
|
|
||||||
def inference(self, kern, X, likelihood, Y, Y_metadata=None):
|
def inference(self, kern, X, likelihood, Y, Y_metadata=None):
|
||||||
|
num_data, output_dim = X.shape
|
||||||
|
assert output_dim ==1, "ep in 1D only (for now!)"
|
||||||
|
|
||||||
K = kern.K(X)
|
K = kern.K(X)
|
||||||
|
|
||||||
mu_tilde, tau_tilde = self.expectation_propagation()
|
mu_tilde, tau_tilde = self.expectation_propagation()
|
||||||
|
|
||||||
|
Wi, LW, LWi, W_logdet = pdinv(K + np.diag(1./tau_tilde)
|
||||||
|
|
||||||
|
alpha, _ = dpotrs(LW, mu_tilde, lower=1)
|
||||||
|
|
||||||
|
log_marginal = 0.5*(-num_data * log_2_pi - W_logdet - np.sum(alpha * mu_tilde))
|
||||||
|
|
||||||
|
dL_dK = 0.5 * (tdot(alpha[:,None]) - Wi)
|
||||||
|
|
||||||
|
#TODO: what abot derivatives of the likelihood parameters?
|
||||||
|
|
||||||
|
return Posterior(woodbury_inv=Wi, woodbury_vector=alpha, K=K), log_marginal, {'dL_dK':dL_dK}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def expectation_propagation(self, K, Y, Y_metadata, likelihood)
|
def expectation_propagation(self, K, Y, Y_metadata, likelihood)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,8 +49,7 @@ class ExactGaussianInference(object):
|
||||||
|
|
||||||
dL_dK = 0.5 * (tdot(alpha) - Y.shape[1] * Wi)
|
dL_dK = 0.5 * (tdot(alpha) - Y.shape[1] * Wi)
|
||||||
|
|
||||||
kern.update_gradients_full(dL_dK, X)
|
#TODO: does this really live here?
|
||||||
|
|
||||||
likelihood.update_gradients(np.diag(dL_dK))
|
likelihood.update_gradients(np.diag(dL_dK))
|
||||||
|
|
||||||
return Posterior(woodbury_chol=LW, woodbury_vector=alpha, K=K), log_marginal, {'dL_dK':dL_dK}
|
return Posterior(woodbury_chol=LW, woodbury_vector=alpha, K=K), log_marginal, {'dL_dK':dL_dK}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,27 @@ import numpy as np
|
||||||
import warnings
|
import warnings
|
||||||
from .. import kern
|
from .. import kern
|
||||||
|
|
||||||
|
def build_XY(input_list,output_list=None,index=None):
|
||||||
|
num_outputs = len(input_list)
|
||||||
|
_s = [0] + [ _x.shape[0] for _x in input_list ]
|
||||||
|
_s = np.cumsum(_s)
|
||||||
|
slices = [slice(a,b) for a,b in zip(_s[:-1],_s[1:])]
|
||||||
|
if output_list is not None:
|
||||||
|
assert num_outputs == len(output_list)
|
||||||
|
Y = np.vstack(output_list)
|
||||||
|
else:
|
||||||
|
Y = None
|
||||||
|
|
||||||
|
if index is not None:
|
||||||
|
assert len(index) == num_outputs
|
||||||
|
I = np.vstack( [j*np.ones((_x.shape[0],1)) for _x,j in zip(input_list,index)] )
|
||||||
|
else:
|
||||||
|
I = np.vstack( [j*np.ones((_x.shape[0],1)) for _x,j in zip(input_list,range(num_outputs))] )
|
||||||
|
|
||||||
|
X = np.vstack(input_list)
|
||||||
|
X = np.hstack([X,I])
|
||||||
|
return X,Y,slices
|
||||||
|
|
||||||
def build_lcm(input_dim, num_outputs, CK = [], NC = [], W_columns=1,W=None,kappa=None):
|
def build_lcm(input_dim, num_outputs, CK = [], NC = [], W_columns=1,W=None,kappa=None):
|
||||||
#TODO build_icm or build_lcm
|
#TODO build_icm or build_lcm
|
||||||
"""
|
"""
|
||||||
|
|
@ -25,9 +46,9 @@ def build_lcm(input_dim, num_outputs, CK = [], NC = [], W_columns=1,W=None,kappa
|
||||||
k.input_dim = input_dim + 1
|
k.input_dim = input_dim + 1
|
||||||
warnings.warn("kernel's input dimension overwritten to fit input_dim parameter.")
|
warnings.warn("kernel's input dimension overwritten to fit input_dim parameter.")
|
||||||
|
|
||||||
kernel = CK[0].prod(kern.coregionalize(num_outputs,W_columns,W,kappa),tensor=True)
|
kernel = CK[0].prod(kern.Coregionalize(num_outputs,W_columns,W,kappa),tensor=True)
|
||||||
for k in CK[1:]:
|
for k in CK[1:]:
|
||||||
k_coreg = kern.coregionalize(num_outputs,W_columns,W,kappa)
|
k_coreg = kern.Coregionalize(num_outputs,W_columns,W,kappa)
|
||||||
kernel += k.prod(k_coreg,tensor=True)
|
kernel += k.prod(k_coreg,tensor=True)
|
||||||
for k in NC:
|
for k in NC:
|
||||||
kernel += k
|
kernel += k
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue