From 169fd9b8d4852b29f77ac05535f1cb8a311a7008 Mon Sep 17 00:00:00 2001 From: Alan Saul Date: Fri, 14 Mar 2014 12:42:36 +0000 Subject: [PATCH] Stablised exp link_function and quadrature variances --- GPy/likelihoods/likelihood.py | 8 +++++++- GPy/likelihoods/link_functions.py | 11 +++++++---- GPy/likelihoods/poisson.py | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/GPy/likelihoods/likelihood.py b/GPy/likelihoods/likelihood.py index 3eafedb1..4b8881de 100644 --- a/GPy/likelihoods/likelihood.py +++ b/GPy/likelihoods/likelihood.py @@ -178,7 +178,13 @@ class Likelihood(Parameterized): #E( E(Y_star|f_star)**2 ) def int_pred_mean_sq(f,m,v,predictive_mean_sq): - return self.conditional_mean(f)**2*np.exp(-(0.5/v)*np.square(f - m)) + p = np.exp(-(0.5/v)*np.square(f - m)) + #If p is zero then conditional_mean**2 will overflow + if p < 1e-10: + return 0. + else: + return self.conditional_mean(f)**2*p + scaled_exp_exp2 = [quad(int_pred_mean_sq, -np.inf, np.inf,args=(mj,s2j,pm2j))[0] for mj,s2j,pm2j in zip(mu,variance,predictive_mean_sq)] exp_exp2 = np.array(scaled_exp_exp2)[:,None] / normalizer diff --git a/GPy/likelihoods/link_functions.py b/GPy/likelihoods/link_functions.py index 2a1bf147..942fe2f4 100644 --- a/GPy/likelihoods/link_functions.py +++ b/GPy/likelihoods/link_functions.py @@ -6,6 +6,9 @@ from scipy import stats import scipy as sp from GPy.util.univariate_Gaussian import std_norm_pdf,std_norm_cdf,inv_std_norm_cdf +_exp_lim_val = np.finfo(np.float64).max +_lim_val = np.log(_exp_lim_val) + class GPTransformation(object): """ Link function class for doing non-Gaussian likelihoods approximation @@ -92,16 +95,16 @@ class Log(GPTransformation): """ def transf(self,f): - return np.exp(f) + return np.exp(np.clip(f, -_lim_val, _lim_val)) def dtransf_df(self,f): - return np.exp(f) + return np.exp(np.clip(f, -_lim_val, _lim_val)) def d2transf_df2(self,f): - return np.exp(f) + return np.exp(np.clip(f, -_lim_val, _lim_val)) def d3transf_df3(self,f): - return np.exp(f) + return np.exp(np.clip(f, -_lim_val, _lim_val)) class Log_ex_1(GPTransformation): """ diff --git a/GPy/likelihoods/poisson.py b/GPy/likelihoods/poisson.py index 419514d1..c67a7e12 100644 --- a/GPy/likelihoods/poisson.py +++ b/GPy/likelihoods/poisson.py @@ -21,7 +21,7 @@ class Poisson(Likelihood): """ def __init__(self, gp_link=None): if gp_link is None: - gp_link = link_functions.Log_ex_1() + gp_link = link_functions.Log() super(Poisson, self).__init__(gp_link, name='Poisson')