diff --git a/GPy/likelihoods/student_t.py b/GPy/likelihoods/student_t.py index 04ad93e6..79745ff6 100644 --- a/GPy/likelihoods/student_t.py +++ b/GPy/likelihoods/student_t.py @@ -36,9 +36,6 @@ class StudentT(Likelihood): self.log_concave = False - #def parameters_changed(self): - #self.variance = (self.v / float(self.v - 2)) * self.sigma2 - def update_gradients(self, grads): """ Pull out the gradients, be careful as the order must match the order @@ -231,8 +228,8 @@ class StudentT(Likelihood): df = float(self.v[:]) s2 = float(self.sigma2[:]) dlogpdf_dv = 0.5*digamma(0.5*(df+1)) - 0.5*digamma(0.5*df) - 1.0/(2*df) - dlogpdf_dv += (1.0/(2*df))*(df+1)*e/(e2 + s2*df) - dlogpdf_dv -= np.log(1 + e2/(s2*df)) + dlogpdf_dv += 0.5*(df+1)*e2/(df*(e2 + s2*df)) + dlogpdf_dv -= 0.5*np.log1p(e2/(s2*df)) return dlogpdf_dv def dlogpdf_dlink_dv(self, inv_link_f, y, Y_metadata=None): @@ -248,9 +245,8 @@ class StudentT(Likelihood): e2 = np.square(e) df = float(self.v[:]) s2 = float(self.sigma2[:]) - #derivative of hess = ((self.v + 1)*(e**2 - self.v*self.sigma2)) / ((self.sigma2*self.v + e**2)**2) e2_s2v = e**2 + s2*df - d2logpdf_df2_dv = (e2 - s2*df - s2*(df + 1))/e2_s2v**2 - 2*s2*(df+1)*(e2 - s2*df)/e2_s2v + d2logpdf_df2_dv = (-s2*(df+1) + e2 - s2*df)/e2_s2v**2 - 2*s2*(df+1)*(e2 - s2*df)/e2_s2v**3 return d2logpdf_df2_dv def dlogpdf_link_dtheta(self, f, y, Y_metadata=None): diff --git a/GPy/testing/likelihood_tests.py b/GPy/testing/likelihood_tests.py index 7fa5886f..bef90835 100644 --- a/GPy/testing/likelihood_tests.py +++ b/GPy/testing/likelihood_tests.py @@ -93,6 +93,9 @@ def dparam_checkgrad(func, dfunc, params, params_names, args, constraints=None, if not grad.checkgrad(verbose=True): gradchecking = False + if not grad.checkgrad(verbose=True): + gradchecking = False + return gradchecking @@ -116,6 +119,7 @@ class TestNoiseModels(object): self.integer_Y = np.where(tmp > 0, tmp, 0) self.var = 0.2 + self.deg_free = 4.0 #Make a bigger step as lower bound can be quite curved self.step = 1e-4 @@ -135,56 +139,56 @@ class TestNoiseModels(object): } """ self.noise_models = {"Student_t_default": { - "model": GPy.likelihoods.StudentT(deg_free=5, sigma2=self.var), + "model": GPy.likelihoods.StudentT(deg_free=self.deg_free, sigma2=self.var), "grad_params": { - "names": [".*t_scale2"], - "vals": [self.var], - "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_fixed)] + "names": [".*t_scale2", ".*deg_free"], + "vals": [self.var, self.deg_free], + "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_positive)] }, "laplace": True }, "Student_t_1_var": { - "model": GPy.likelihoods.StudentT(deg_free=5, sigma2=self.var), + "model": GPy.likelihoods.StudentT(deg_free=self.deg_free, sigma2=self.var), "grad_params": { - "names": [".*t_scale2"], - "vals": [1.0], - "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_fixed)] + "names": [".*t_scale2", ".*deg_free"], + "vals": [1.0, 8.0], + "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_positive)] }, "laplace": True }, "Student_t_small_deg_free": { "model": GPy.likelihoods.StudentT(deg_free=1.5, sigma2=self.var), "grad_params": { - "names": [".*t_scale2"], - "vals": [self.var], - "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_fixed)] + "names": [".*t_scale2", ".*deg_free"], + "vals": [self.var, 1.5], + "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_positive)] }, "laplace": True }, "Student_t_small_var": { - "model": GPy.likelihoods.StudentT(deg_free=5, sigma2=self.var), + "model": GPy.likelihoods.StudentT(deg_free=self.deg_free, sigma2=self.var), "grad_params": { - "names": [".*t_scale2"], - "vals": [0.001], - "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_fixed)] + "names": [".*t_scale2", ".*deg_free"], + "vals": [0.001, self.deg_free], + "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_positive)] }, "laplace": True }, "Student_t_large_var": { - "model": GPy.likelihoods.StudentT(deg_free=5, sigma2=self.var), + "model": GPy.likelihoods.StudentT(deg_free=self.deg_free, sigma2=self.var), "grad_params": { - "names": [".*t_scale2"], - "vals": [10.0], - "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_fixed)] + "names": [".*t_scale2", ".*deg_free"], + "vals": [10.0, self.deg_free], + "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_positive)] }, "laplace": True }, "Student_t_approx_gauss": { "model": GPy.likelihoods.StudentT(deg_free=1000, sigma2=self.var), "grad_params": { - "names": [".*t_scale2"], - "vals": [self.var], - "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_fixed)] + "names": [".*t_scale2", ".*deg_free"], + "vals": [self.var, 1000], + "constraints": [(".*t_scale2", self.constrain_positive), (".*deg_free", self.constrain_positive)] }, "laplace": True },