mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-21 14:05:14 +02:00
Student t likelihood function checkgrads (summed gradients wrt to sigma2), maybe some numerical instability in laplace
This commit is contained in:
parent
b663fff622
commit
5e88a885b1
3 changed files with 34 additions and 17 deletions
|
|
@ -127,7 +127,6 @@ class Laplace(likelihood):
|
|||
#- 0.5*np.trace(mdot(self.Ki_W_i, (self.K, np.diagflat(dlik_hess_dthetaL[thetaL_i]))))
|
||||
+ np.dot(0.5*np.diag(self.Ki_W_i)[:,None].T, dlik_hess_dthetaL[thetaL_i])
|
||||
)
|
||||
import ipdb; ipdb.set_trace() # XXX BREAKPOINT
|
||||
|
||||
#Implicit
|
||||
df_hat_dthetaL = mdot(I_KW_i, self.K, dlik_grad_dthetaL[thetaL_i])
|
||||
|
|
@ -203,7 +202,7 @@ class Laplace(likelihood):
|
|||
#self.cC = 0.5*self.y_Wi_Ki_i_y
|
||||
#self.dD = -0.5*self.ln_B_det
|
||||
#print "Ztilde: {} lik: {} a: {} b: {} c: {} d:".format(Z_tilde, self.lik, self.aA, self.bB, self.cC, self.dD)
|
||||
print "param value: {}".format(self.likelihood_function._get_params())
|
||||
#print "param value: {}".format(self.likelihood_function._get_params())
|
||||
|
||||
#Convert to float as its (1, 1) and Z must be a scalar
|
||||
self.Z = np.float64(Z_tilde)
|
||||
|
|
@ -330,7 +329,6 @@ class Laplace(likelihood):
|
|||
self.old_before_s = self.likelihood_function._get_params()
|
||||
#print "before: ", self.old_before_s
|
||||
#if self.old_before_s < 1e-5:
|
||||
#import ipdb; ipdb.set_trace() ### XXX BREAKPOINT
|
||||
|
||||
#old_a = np.zeros((self.N, 1))
|
||||
if self.old_a is None:
|
||||
|
|
@ -384,7 +382,6 @@ class Laplace(likelihood):
|
|||
new_obj = sp.optimize.minimize_scalar(i_o, method='brent', tol=1e-4, options={'maxiter':20, 'disp':True}).fun
|
||||
f = self.f.copy()
|
||||
a = self.a.copy()
|
||||
#import ipdb; ipdb.set_trace() ### XXX BREAKPOINT
|
||||
|
||||
#f_old = f.copy()
|
||||
#update_passed = False
|
||||
|
|
|
|||
|
|
@ -218,16 +218,11 @@ class StudentT(LikelihoodFunction):
|
|||
"""
|
||||
assert y.shape == f.shape
|
||||
e = y - f
|
||||
#A = gammaln((self.v + 1) * 0.5)
|
||||
#B = - gammaln(self.v * 0.5)
|
||||
#C = - 0.5*np.log(self.sigma2 * self.v * np.pi)
|
||||
#D = + (-(self.v + 1)*0.5)*np.log(1 + ((e**2)/self.sigma2)/np.float(self.v))
|
||||
objective = (+ gammaln((self.v + 1) * 0.5)
|
||||
- gammaln(self.v * 0.5)
|
||||
- 0.5*np.log(self.sigma2 * self.v * np.pi)
|
||||
+ (-(self.v + 1)*0.5)*np.log(1 + ((e**2)/self.sigma2)/np.float(self.v))
|
||||
- 0.5*(self.v + 1)*np.log(1 + (1/np.float(self.v))*((e**2)/self.sigma2))
|
||||
)
|
||||
#print "C: {} D: {} obj: {}".format(C, np.sum(D), objective.sum())
|
||||
return np.sum(objective)
|
||||
|
||||
def dlik_df(self, y, f, extra_data=None):
|
||||
|
|
@ -291,9 +286,13 @@ class StudentT(LikelihoodFunction):
|
|||
"""
|
||||
assert y.shape == f.shape
|
||||
e = y - f
|
||||
#FIXME: OUT BY SOME FUNCTION OF N
|
||||
#FIXME: OUT BY SOME FUNCTION OF N, or the fact that we are summing over several things in the objective?
|
||||
dlik_dvar = self.v*(e**2 - self.sigma2)/(2*self.sigma2*(self.sigma2*self.v + e**2))
|
||||
return dlik_dvar
|
||||
#dlik_dvar = ( 0.5*(1/float(self.sigma2))
|
||||
#-0.5*(self.v + 1)*(-(1/float(self.v))*(e**2)/(1/(float(self.sigma2**2))))
|
||||
#/ (1 + (1/float(self.v))*((e**2)/float(self.sigma2)))
|
||||
#)
|
||||
return np.sum(dlik_dvar) #May not want to sum over all dimensions if using many D?
|
||||
|
||||
def dlik_df_dvar(self, y, f, extra_data=None):
|
||||
"""
|
||||
|
|
@ -516,8 +515,7 @@ class Gaussian(LikelihoodFunction):
|
|||
e = y - f
|
||||
s_4 = 1.0/(self._variance**2)
|
||||
dlik_dsigma = -0.5*self.N/self._variance + 0.5*s_4*np.dot(e.T, e)
|
||||
#dlik_dsigma = -0.5*self.N + 0.5*s_4*np.dot(e.T, e)
|
||||
return dlik_dsigma
|
||||
return np.sum(dlik_dsigma) # Sure about this sum?
|
||||
|
||||
def dlik_df_dvar(self, y, f, extra_data=None):
|
||||
"""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue