diff --git a/GPy/core/model.py b/GPy/core/model.py index 95d4565d..6fbc9623 100644 --- a/GPy/core/model.py +++ b/GPy/core/model.py @@ -453,7 +453,12 @@ class Model(Parameterized): if not verbose: # just check the global ratio - dx = step * np.sign(np.random.uniform(-1, 1, x.size)) + + #choose a random direction to find the linear approximation in + if x.size==2: + dx = step * np.ones(2) # random direction for 2 parameters can fail dure to symmetry + else: + dx = step * np.sign(np.random.uniform(-1, 1, x.size)) # evaulate around the point x f1, g1 = self.objective_and_gradients(x + dx) diff --git a/GPy/examples/laplace_approximations.py b/GPy/examples/laplace_approximations.py index 64185885..f74e4d37 100644 --- a/GPy/examples/laplace_approximations.py +++ b/GPy/examples/laplace_approximations.py @@ -2,7 +2,7 @@ import GPy import numpy as np import matplotlib.pyplot as plt from GPy.util import datasets -np.random.seed(1) +#np.random.seed(1) def student_t_approx(): """ @@ -106,7 +106,7 @@ def student_t_approx(): corrupt_stu_t_likelihood = GPy.likelihoods.Laplace(Yc.copy(), t_distribution) m = GPy.models.GPRegression(X, Yc.copy(), kernel4, likelihood=corrupt_stu_t_likelihood) m.ensure_default_constraints() - m.constrain_positive('t_noise') + m.constrain_bounded('t_noise', 1e-6, 10.) m.constrain_fixed('white', 1e-4) m.randomize() for a in range(1): diff --git a/GPy/likelihoods/laplace.py b/GPy/likelihoods/laplace.py index 6941de48..57160d64 100644 --- a/GPy/likelihoods/laplace.py +++ b/GPy/likelihoods/laplace.py @@ -65,11 +65,10 @@ class Laplace(likelihood): self.old_Ki_f = None - def predictive_values(self, mu, var, full_cov): + def predictive_values(self,mu,var,full_cov,**noise_args): if full_cov: - raise NotImplementedError("Cannot make correlated predictions\ - with an Laplace likelihood") - return self.noise_model.predictive_values(mu, var) + raise NotImplementedError, "Cannot make correlated predictions with an EP likelihood" + return self.noise_model.predictive_values(mu,var,**noise_args) def log_predictive_density(self, y_test, mu_star, var_star): """ @@ -209,6 +208,7 @@ class Laplace(likelihood): - 0.5*self.f_Ki_f + 0.5*self.y_Wi_Ki_i_y ) + #print "Term, {}, {}, {}, {}, {}".format(self.lik, - 0.5*self.ln_B_det, + 0.5*self.ln_det_Wi_K, - 0.5*self.f_Ki_f, + 0.5*self.y_Wi_Ki_i_y) #Convert to float as its (1, 1) and Z must be a scalar self.Z = np.float64(Z_tilde) @@ -349,7 +349,8 @@ class Laplace(likelihood): #Find the stepsize that minimizes the objective function using a brent line search #The tolerance and maxiter matter for speed! Seems to be best to keep them low and make more full #steps than get this exact then make a step, if B was bigger it might be the other way around though - new_obj = sp.optimize.minimize_scalar(i_o, method='brent', tol=1e-4, options={'maxiter':5}).fun + #new_obj = sp.optimize.minimize_scalar(i_o, method='brent', tol=1e-4, options={'maxiter':5}).fun + new_obj = sp.optimize.brent(i_o, tol=1e-4, maxiter=10) f = self.tmp_f.copy() Ki_f = self.tmp_Ki_f.copy() @@ -380,8 +381,8 @@ class Laplace(likelihood): #difference = abs(new_obj - old_obj) #old_obj = new_obj.copy() - #difference = np.abs(np.sum(f - f_old)) - difference = np.abs(np.sum(Ki_f - old_Ki_f)) + difference = np.abs(np.sum(f - f_old)) + #difference = np.abs(np.sum(Ki_f - old_Ki_f)) old_Ki_f = Ki_f.copy() i += 1 diff --git a/GPy/testing/likelihoods_tests.py b/GPy/testing/likelihoods_tests.py index 191dae57..9b7b7eb6 100644 --- a/GPy/testing/likelihoods_tests.py +++ b/GPy/testing/likelihoods_tests.py @@ -6,6 +6,8 @@ import functools import inspect from GPy.likelihoods.noise_models import gp_transformations from functools import partial +#np.random.seed(300) +np.random.seed(7) def dparam_partial(inst_func, *args): """ @@ -144,7 +146,7 @@ class TestNoiseModels(object): "model": GPy.likelihoods.student_t(deg_free=5, sigma2=self.var), "grad_params": { "names": ["t_noise"], - "vals": [1], + "vals": [1.0], "constraints": [constrain_positive] }, "laplace": True @@ -158,6 +160,15 @@ class TestNoiseModels(object): }, "laplace": True }, + "Student_t_large_var": { + "model": GPy.likelihoods.student_t(deg_free=5, sigma2=self.var), + "grad_params": { + "names": ["t_noise"], + "vals": [10.0], + "constraints": [constrain_positive] + }, + "laplace": True + }, "Student_t_approx_gauss": { "model": GPy.likelihoods.student_t(deg_free=1000, sigma2=self.var), "grad_params": { @@ -315,9 +326,11 @@ class TestNoiseModels(object): def t_logpdf(self, model, Y, f): print "\n{}".format(inspect.stack()[0][3]) print model + print model._get_params() np.testing.assert_almost_equal( - np.log(model.pdf(f.copy(), Y.copy())), - model.logpdf(f.copy(), Y.copy())) + model.pdf(f.copy(), Y.copy()), + np.exp(model.logpdf(f.copy(), Y.copy())) + ) @with_setup(setUp, tearDown) def t_dlogpdf_df(self, model, Y, f): @@ -363,7 +376,7 @@ class TestNoiseModels(object): assert ( dparam_checkgrad(model.logpdf, model.dlogpdf_dtheta, params, args=(f, Y), constraints=param_constraints, - randomize=False, verbose=True) + randomize=True, verbose=True) ) @with_setup(setUp, tearDown) @@ -373,7 +386,7 @@ class TestNoiseModels(object): assert ( dparam_checkgrad(model.dlogpdf_df, model.dlogpdf_df_dtheta, params, args=(f, Y), constraints=param_constraints, - randomize=False, verbose=True) + randomize=True, verbose=True) ) @with_setup(setUp, tearDown) @@ -383,7 +396,7 @@ class TestNoiseModels(object): assert ( dparam_checkgrad(model.d2logpdf_df2, model.d2logpdf_df2_dtheta, params, args=(f, Y), constraints=param_constraints, - randomize=False, verbose=True) + randomize=True, verbose=True) ) ################ @@ -478,7 +491,7 @@ class TestNoiseModels(object): print "\n{}".format(inspect.stack()[0][3]) #Normalize Y = Y/Y.max() - white_var = 0.001 + white_var = 1e-6 kernel = GPy.kern.rbf(X.shape[1]) + GPy.kern.white(X.shape[1]) laplace_likelihood = GPy.likelihoods.Laplace(Y.copy(), model) m = GPy.models.GPRegression(X.copy(), Y.copy(), kernel, likelihood=laplace_likelihood) @@ -490,12 +503,13 @@ class TestNoiseModels(object): m[name] = param_vals[param_num] constraints[param_num](name, m) + print m m.randomize() - m.optimize(max_iters=8) + #m.optimize(max_iters=8) print m m.checkgrad(verbose=1, step=step) - if not m.checkgrad(step=step): - m.checkgrad(verbose=1, step=step) + #if not m.checkgrad(step=step): + #m.checkgrad(verbose=1, step=step) #import ipdb; ipdb.set_trace() #NOTE this test appears to be stochastic for some likelihoods (student t?) # appears to all be working in test mode right now... @@ -509,7 +523,7 @@ class TestNoiseModels(object): print "\n{}".format(inspect.stack()[0][3]) #Normalize Y = Y/Y.max() - white_var = 0.001 + white_var = 1e-6 kernel = GPy.kern.rbf(X.shape[1]) + GPy.kern.white(X.shape[1]) ep_likelihood = GPy.likelihoods.EP(Y.copy(), model) m = GPy.models.GPRegression(X.copy(), Y.copy(), kernel, likelihood=ep_likelihood) diff --git a/GPy/util/__init__.py b/GPy/util/__init__.py index 629b3f48..2d2b6e17 100644 --- a/GPy/util/__init__.py +++ b/GPy/util/__init__.py @@ -14,6 +14,15 @@ import visualize import decorators import classification import latent_space_visualizations -import symbolic + +try: + import sympy + _sympy_available = True + del sympy +except ImportError as e: + _sympy_available = False + +if _sympy_available: + import symbolic import netpbmfile diff --git a/GPy/util/linalg.py b/GPy/util/linalg.py index 9db769e6..e3e421f6 100644 --- a/GPy/util/linalg.py +++ b/GPy/util/linalg.py @@ -12,6 +12,7 @@ import ctypes from ctypes import byref, c_char, c_int, c_double # TODO # import scipy.lib.lapack import scipy +import warnings if np.all(np.float64((scipy.__version__).split('.')[:2]) >= np.array([0, 12])): import scipy.linalg.lapack as lapack @@ -25,6 +26,9 @@ try: assert hasattr(_blaslib, 'dsyr_') except AssertionError: _blas_available = False +except AttributeError as e: + _blas_available = False + warnings.warn("warning: caught this exception:" + str(e)) def dtrtrs(A, B, lower=0, trans=0, unitdiag=0): """ diff --git a/setup.py b/setup.py index 9ccf3990..88ee6257 100644 --- a/setup.py +++ b/setup.py @@ -18,9 +18,9 @@ setup(name = 'GPy', license = "BSD 3-clause", keywords = "machine-learning gaussian-processes kernels", url = "http://sheffieldml.github.com/GPy/", - packages = ['GPy', 'GPy.core', 'GPy.kern', 'GPy.util', 'GPy.models', 'GPy.inference', 'GPy.examples', 'GPy.likelihoods', 'GPy.testing', 'GPy.util.latent_space_visualizations', 'GPy.util.latent_space_visualizations.controllers', 'GPy.likelihoods.noise_models', 'GPy.kern.parts', 'GPy.mappings'], + packages = ['GPy', 'GPy.core', 'GPy.kern', 'GPy.util', 'GPy._models', 'GPy.inference', 'GPy.examples', 'GPy.likelihoods', 'GPy.testing', 'GPy.util.latent_space_visualizations', 'GPy.util.latent_space_visualizations.controllers', 'GPy.likelihoods.noise_models', 'GPy.kern.parts', 'GPy.mappings'], package_dir={'GPy': 'GPy'}, - package_data = {'GPy': ['GPy/examples']}, + package_data = {'GPy': ['GPy/examples', 'gpy_config.cfg']}, py_modules = ['GPy.__init__'], long_description=read('README.md'), install_requires=['numpy>=1.6', 'scipy>=0.9','matplotlib>=1.1', 'nose'],