mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-06-05 14:55:15 +02:00
bugfix: sparseGP.likelihood.Z not added to log_ll
This commit is contained in:
parent
43cd5ad50b
commit
df1e765507
1 changed files with 17 additions and 17 deletions
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pylab as pb
|
import pylab as pb
|
||||||
from ..util.linalg import mdot, jitchol, tdot, symmetrify, backsub_both_sides,chol_inv
|
from ..util.linalg import mdot, jitchol, tdot, symmetrify, backsub_both_sides, chol_inv
|
||||||
from ..util.plot import gpplot
|
from ..util.plot import gpplot
|
||||||
from .. import kern
|
from .. import kern
|
||||||
from GP import GP
|
from GP import GP
|
||||||
|
|
@ -151,7 +151,7 @@ class sparse_GP(GP):
|
||||||
B = -0.5 * self.D * (np.sum(self.likelihood.precision * self.psi0) - np.trace(self.A))
|
B = -0.5 * self.D * (np.sum(self.likelihood.precision * self.psi0) - np.trace(self.A))
|
||||||
C = -self.D * (np.sum(np.log(np.diag(self.LB)))) # + 0.5 * self.M * np.log(sf2))
|
C = -self.D * (np.sum(np.log(np.diag(self.LB)))) # + 0.5 * self.M * np.log(sf2))
|
||||||
D = 0.5 * np.sum(np.square(self._LBi_Lmi_psi1V))
|
D = 0.5 * np.sum(np.square(self._LBi_Lmi_psi1V))
|
||||||
return A + B + C + D
|
return A + B + C + D + self.likelihood.Z
|
||||||
|
|
||||||
def _set_params(self, p):
|
def _set_params(self, p):
|
||||||
self.Z = p[:self.M * self.Q].reshape(self.M, self.Q)
|
self.Z = p[:self.M * self.Q].reshape(self.M, self.Q)
|
||||||
|
|
@ -173,15 +173,15 @@ class sparse_GP(GP):
|
||||||
For a Gaussian likelihood, no iteration is required:
|
For a Gaussian likelihood, no iteration is required:
|
||||||
this function does nothing
|
this function does nothing
|
||||||
"""
|
"""
|
||||||
if not isinstance(self.likelihood,Gaussian): #Updates not needed for Gaussian likelihood
|
if not isinstance(self.likelihood, Gaussian): # Updates not needed for Gaussian likelihood
|
||||||
self.likelihood.restart() #TODO check consistency with pseudo_EP
|
self.likelihood.restart() # TODO check consistency with pseudo_EP
|
||||||
if self.has_uncertain_inputs:
|
if self.has_uncertain_inputs:
|
||||||
Lmi = chol_inv(self.Lm)
|
Lmi = chol_inv(self.Lm)
|
||||||
Kmmi = tdot(Lmi.T)
|
Kmmi = tdot(Lmi.T)
|
||||||
diag_tr_psi2Kmmi = np.array([np.trace(psi2_Kmmi) for psi2_Kmmi in np.dot(self.psi2,Kmmi)])
|
diag_tr_psi2Kmmi = np.array([np.trace(psi2_Kmmi) for psi2_Kmmi in np.dot(self.psi2, Kmmi)])
|
||||||
|
|
||||||
self.likelihood.fit_FITC(self.Kmm,self.psi1,diag_tr_psi2Kmmi) #This uses the fit_FITC code, but does not perfomr a FITC-EP.#TODO solve potential confusion
|
self.likelihood.fit_FITC(self.Kmm, self.psi1, diag_tr_psi2Kmmi) # This uses the fit_FITC code, but does not perfomr a FITC-EP.#TODO solve potential confusion
|
||||||
#raise NotImplementedError, "EP approximation not implemented for uncertain inputs"
|
# raise NotImplementedError, "EP approximation not implemented for uncertain inputs"
|
||||||
else:
|
else:
|
||||||
self.likelihood.fit_DTC(self.Kmm, self.psi1)
|
self.likelihood.fit_DTC(self.Kmm, self.psi1)
|
||||||
# self.likelihood.fit_FITC(self.Kmm,self.psi1,self.psi0)
|
# self.likelihood.fit_FITC(self.Kmm,self.psi1,self.psi0)
|
||||||
|
|
@ -235,14 +235,14 @@ class sparse_GP(GP):
|
||||||
var = Kxx - np.sum(Kx * np.dot(Kmmi_LmiBLmi, Kx), 0)
|
var = Kxx - np.sum(Kx * np.dot(Kmmi_LmiBLmi, Kx), 0)
|
||||||
else:
|
else:
|
||||||
# assert which_parts=='all', "swithching out parts of variational kernels is not implemented"
|
# assert which_parts=='all', "swithching out parts of variational kernels is not implemented"
|
||||||
Kx = self.kern.psi1(self.Z, Xnew, X_variance_new)#, which_parts=which_parts) TODO: which_parts
|
Kx = self.kern.psi1(self.Z, Xnew, X_variance_new) # , which_parts=which_parts) TODO: which_parts
|
||||||
mu = np.dot(Kx, self.Cpsi1V)
|
mu = np.dot(Kx, self.Cpsi1V)
|
||||||
if full_cov:
|
if full_cov:
|
||||||
raise NotImplementedError, "TODO"
|
raise NotImplementedError, "TODO"
|
||||||
else:
|
else:
|
||||||
Kxx = self.kern.psi0(self.Z,Xnew,X_variance_new)
|
Kxx = self.kern.psi0(self.Z, Xnew, X_variance_new)
|
||||||
psi2 = self.kern.psi2(self.Z,Xnew,X_variance_new)
|
psi2 = self.kern.psi2(self.Z, Xnew, X_variance_new)
|
||||||
var = Kxx - np.sum(np.sum(psi2*Kmmi_LmiBLmi[None,:,:],1),1)
|
var = Kxx - np.sum(np.sum(psi2 * Kmmi_LmiBLmi[None, :, :], 1), 1)
|
||||||
|
|
||||||
return mu, var[:, None]
|
return mu, var[:, None]
|
||||||
|
|
||||||
|
|
@ -272,9 +272,9 @@ class sparse_GP(GP):
|
||||||
# normalize X values
|
# normalize X values
|
||||||
Xnew = (Xnew.copy() - self._Xmean) / self._Xstd
|
Xnew = (Xnew.copy() - self._Xmean) / self._Xstd
|
||||||
if X_variance_new is not None:
|
if X_variance_new is not None:
|
||||||
X_variance_new = X_variance_new / self._Xstd**2
|
X_variance_new = X_variance_new / self._Xstd ** 2
|
||||||
|
|
||||||
#here's the actual prediction by the GP model
|
# here's the actual prediction by the GP model
|
||||||
mu, var = self._raw_predict(Xnew, X_variance_new, full_cov=full_cov, which_parts=which_parts)
|
mu, var = self._raw_predict(Xnew, X_variance_new, full_cov=full_cov, which_parts=which_parts)
|
||||||
|
|
||||||
# now push through likelihood
|
# now push through likelihood
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue