From c76f1a4d6dcc70115e0eff4520f8257f395292a9 Mon Sep 17 00:00:00 2001 From: Alan Saul Date: Tue, 11 Feb 2014 14:06:42 +0000 Subject: [PATCH 1/5] Minor reorganising --- GPy/core/parameterization/param.py | 8 ++++---- GPy/inference/latent_function_inference/laplace.py | 5 ++--- GPy/testing/likelihood_tests.py | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/GPy/core/parameterization/param.py b/GPy/core/parameterization/param.py index 583c6425..772cbd42 100644 --- a/GPy/core/parameterization/param.py +++ b/GPy/core/parameterization/param.py @@ -157,14 +157,14 @@ class Param(ObservableArray, Constrainable, Gradcheckable): #=========================================================================== def tie_to(self, param): """ - :param param: the parameter object to tie this parameter to. + :param param: the parameter object to tie this parameter to. Can be ParamConcatenation (retrieved by regexp search) - + Tie this parameter to the given parameter. Broadcasting is not allowed, but you can tie a whole dimension to one parameter: self[:,0].tie_to(other), where other is a one-value parameter. - + Note: For now only one parameter can have ties, so all of a parameter will be removed, when re-tieing! """ @@ -534,7 +534,7 @@ class ParamConcatenation(object): def checkgrad(self, verbose=0, step=1e-6, tolerance=1e-3): return self.params[0]._highest_parent_._checkgrad(self, verbose, step, tolerance) #checkgrad.__doc__ = Gradcheckable.checkgrad.__doc__ - + __lt__ = lambda self, val: self._vals() < val __le__ = lambda self, val: self._vals() <= val __eq__ = lambda self, val: self._vals() == val diff --git a/GPy/inference/latent_function_inference/laplace.py b/GPy/inference/latent_function_inference/laplace.py index bc81a86a..4edb9a1d 100644 --- a/GPy/inference/latent_function_inference/laplace.py +++ b/GPy/inference/latent_function_inference/laplace.py @@ -92,12 +92,11 @@ class LaplaceInference(object): iteration = 0 while difference > self._mode_finding_tolerance and iteration < self._mode_finding_max_iter: W = -likelihood.d2logpdf_df2(f, Y, extra_data=Y_metadata) - - W_f = W*f grad = likelihood.dlogpdf_df(f, Y, extra_data=Y_metadata) + W_f = W*f + b = W_f + grad # R+W p46 line 6. - #W12BiW12Kb, B_logdet = self._compute_B_statistics(K, W.copy(), np.dot(K, b), likelihood.log_concave) W12BiW12, _, _ = self._compute_B_statistics(K, W, likelihood.log_concave) W12BiW12Kb = np.dot(W12BiW12, np.dot(K, b)) diff --git a/GPy/testing/likelihood_tests.py b/GPy/testing/likelihood_tests.py index 7f48ac95..9920d648 100644 --- a/GPy/testing/likelihood_tests.py +++ b/GPy/testing/likelihood_tests.py @@ -1,10 +1,10 @@ import numpy as np import unittest import GPy -from GPy.models import GradientChecker +from ..models import GradientChecker import functools import inspect -from GPy.likelihoods import link_functions +from ..likelihoods import link_functions from ..core.parameterization import Param from functools import partial #np.random.seed(300) From 610dbed38a313303946696c4c54b6770b100127b Mon Sep 17 00:00:00 2001 From: Alan Saul Date: Tue, 11 Feb 2014 15:23:00 +0000 Subject: [PATCH 2/5] Fixed copy bug of observable array --- GPy/core/parameterization/array_core.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GPy/core/parameterization/array_core.py b/GPy/core/parameterization/array_core.py index 4b5b7700..fe2a951e 100644 --- a/GPy/core/parameterization/array_core.py +++ b/GPy/core/parameterization/array_core.py @@ -25,7 +25,7 @@ class ParamList(list): if el is other: return True return False - + pass class C(np.ndarray): __array_priority__ = 1. @@ -80,8 +80,8 @@ class ObservableArray(ListArray, Observable): def __getslice__(self, start, stop): return self.__getitem__(slice(start, stop)) def __setslice__(self, start, stop, val): - return self.__setitem__(slice(start, stop), val) + return self.__setitem__(slice(start, stop), val) def __copy__(self, *args): - return ObservableArray(self.base.base.copy(*args)) + return ObservableArray(self.view(np.ndarray).copy()) def copy(self, *args): return self.__copy__(*args) From 48c68640ef218c93e0e19b5f7ae05f52ab0d2a40 Mon Sep 17 00:00:00 2001 From: James Hensman Date: Tue, 11 Feb 2014 16:30:12 +0000 Subject: [PATCH 3/5] renaming dtc --- GPy/inference/latent_function_inference/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/GPy/inference/latent_function_inference/__init__.py b/GPy/inference/latent_function_inference/__init__.py index 5184f0b4..139c562f 100644 --- a/GPy/inference/latent_function_inference/__init__.py +++ b/GPy/inference/latent_function_inference/__init__.py @@ -26,3 +26,4 @@ etc. from exact_gaussian_inference import ExactGaussianInference from laplace import LaplaceInference expectation_propagation = 'foo' # TODO +from dtc import DTC From 1b29c0939e13699775b403da4b3610052a099f0a Mon Sep 17 00:00:00 2001 From: James Hensman Date: Tue, 11 Feb 2014 16:44:59 +0000 Subject: [PATCH 4/5] renaming dtc again --- GPy/inference/latent_function_inference/{DTC.py => dtc.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename GPy/inference/latent_function_inference/{DTC.py => dtc.py} (100%) diff --git a/GPy/inference/latent_function_inference/DTC.py b/GPy/inference/latent_function_inference/dtc.py similarity index 100% rename from GPy/inference/latent_function_inference/DTC.py rename to GPy/inference/latent_function_inference/dtc.py From 54b7581c39688e2fefaae3da77216fd7f184f77a Mon Sep 17 00:00:00 2001 From: James Hensman Date: Tue, 11 Feb 2014 20:05:36 +0000 Subject: [PATCH 5/5] changes to DTC --- GPy/core/sparse_gp.py | 4 ++-- GPy/inference/latent_function_inference/dtc.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/GPy/core/sparse_gp.py b/GPy/core/sparse_gp.py index 1879145a..73cc8755 100644 --- a/GPy/core/sparse_gp.py +++ b/GPy/core/sparse_gp.py @@ -38,9 +38,9 @@ class SparseGP(GP): if inference_method is None: if isinstance(likelihood, likelihoods.Gaussian): inference_method = varDTC.VarDTC() - else: + else: #inference_method = ?? - raise NotImplementedError, "what to do what to do?" + raise NotImplementedError, "what to do what to do?" print "defaulting to ", inference_method, "for latent function inference" self.Z = Param('inducing inputs', Z) diff --git a/GPy/inference/latent_function_inference/dtc.py b/GPy/inference/latent_function_inference/dtc.py index cc6e8606..c6f6844c 100644 --- a/GPy/inference/latent_function_inference/dtc.py +++ b/GPy/inference/latent_function_inference/dtc.py @@ -52,20 +52,20 @@ class DTC(object): b, _ = dtrtrs(LA, tmp*beta, lower=1) tmp, _ = dtrtrs(LA, b, lower=1, trans=1) v, _ = dtrtrs(L, tmp, lower=1, trans=1) - tmp = tdrtrs(LA, Li, lower=1, trans=0) + tmp, _ = dtrtrs(LA, Li, lower=1, trans=0) P = tdot(tmp.T) #compute log marginal log_marginal = -0.5*num_data*output_dim*np.log(2*np.pi) + \ -np.sum(np.log(np.diag(LA)))*output_dim + \ 0.5*num_data*output_dim*np.log(beta) + \ - -0.5*beta*np.sum(np.square(Y)) + + -0.5*beta*np.sum(np.square(Y)) + \ 0.5*np.sum(np.square(b)) # Compute dL_dKmm tmp, _ = dtrtrs(L, A_I, lower=1, trans=1) dL_dK, _ = dtrtrs(L, tmp.T, lower=1, trans=0) - tmp, _ = dtrtrs(LA, tmp.T. lower=1, trans=1) + tmp, _ = dtrtrs(LA, tmp.T, lower=1, trans=1) dL_dK -= tdot(tmp.T) dL_dK *= output_dim dL_dK -= tdot(v) @@ -79,17 +79,17 @@ class DTC(object): #compute dL_dR Uv = np.dot(U, v) - dL_dR = 0.5*(np.sum(U*np.dot(P, U.T), 1) - beta * np.sum(np.square(Y, 1)) - 2.*np.sum(Uv*Y, 1) + np.sum(np.square(Uv), 1) + dL_dR = 0.5*(np.sum(U*np.dot(U,P), 1) - beta * np.sum(np.square(Y), 1) - 2.*np.sum(Uv*Y, 1) + np.sum(np.square(Uv), 1) )*beta**2 - grad_dict = {'dL_dKmm': dL_dKmm, 'dL_dKdiag':np.zeros_like(Knn), 'dL_dKnm':dL_dU} + grad_dict = {'dL_dKmm': dL_dK, 'dL_dKdiag':np.zeros_like(Knn), 'dL_dKnm':dL_dU.T} #update gradients kern.update_gradients_sparse(X=X, Z=Z, **grad_dict) likelihood.update_gradients(dL_dR) #construct a posterior object - post = Posterior(woodbury_inv=Kmmi-P, woodbury_vector=v, K=Kmm, mean=None, cov=None, K_chol=Lm) + post = Posterior(woodbury_inv=Kmmi-P, woodbury_vector=v, K=Kmm, mean=None, cov=None, K_chol=L) return post, log_marginal, grad_dict