changes to rbf and white to allow new parameter gradient structure

This commit is contained in:
James Hensman 2014-01-24 14:06:16 +00:00
parent ad5a967b39
commit 7b5e8a9ffc
6 changed files with 43 additions and 46 deletions

View file

@ -24,7 +24,7 @@ class ExactGaussianInference(object):
"""
find a matrix L which satisfies LL^T = YY^T.
Note that L may have fewer columns than Y, else L=Y.
Note that L may have fewer columns than Y, else L=Y.
"""
N, D = Y.shape
if (N>D):
@ -33,22 +33,26 @@ class ExactGaussianInference(object):
#if Y in self.cache, return self.Cache[Y], else store Y in cache and return L.
raise NotImplementedError, 'TODO' #TODO
def inference(self, K, likelihood, Y, Y_metadata=None):
def inference(self, kern, X, likelihood, Y, Y_metadata=None):
"""
Returns a Posterior class containing essential quantities of the posterior
"""
YYT_factor = self.get_YYTfactor(Y)
K = kern.K(X)
Wi, LW, LWi, W_logdet = pdinv(K + likelihood.covariance_matrix(Y, Y_metadata))
alpha, _ = dpotrs(LW, YYT_factor, lower=1)
dL_dK = 0.5 * (tdot(alpha) - Y.shape[1] * Wi)
log_marginal = 0.5*(-Y.size * log_2_pi - Y.shape[1] * W_logdet - np.sum(alpha * YYT_factor))
dL_dtheta_lik = likelihood._gradients(np.diag(dL_dK))
dL_dK = 0.5 * (tdot(alpha) - Y.shape[1] * Wi)
return Posterior(log_marginal, dL_dK, dL_dtheta_lik, LW, alpha, K)
kern.update_gradients_full(dL_dK)
likelihood.update_gradients(np.diag(dL_dK))
return Posterior(log_marginal, dL_dK, LW, alpha, K)