mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-04-27 13:56:23 +02:00
54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
import nump as np
|
|
import GPy
|
|
from GPy.util.linalg import jitchol
|
|
|
|
class Laplace(GPy.likelihoods.likelihood):
|
|
"""Laplace approximation to a posterior"""
|
|
|
|
def __init__(self,data,likelihood_function):
|
|
"""
|
|
Laplace Approximation
|
|
|
|
First find the moments \hat{f} and the hessian at this point (using Newton-Raphson)
|
|
then find the z^{prime} which allows this to be a normalised gaussian instead of a
|
|
non-normalized gaussian
|
|
|
|
Finally we must compute the GP variables (i.e. generate some Y^{squiggle} and z^{squiggle}
|
|
which makes a gaussian the same as the laplace approximation
|
|
|
|
Arguments
|
|
---------
|
|
|
|
:data: @todo
|
|
:likelihood_function: @todo
|
|
|
|
"""
|
|
GPy.likelihoods.likelihood.__init__(self)
|
|
|
|
self.data = data
|
|
self.likelihood_function = likelihood_function
|
|
|
|
#Inital values
|
|
self.N, self.D = self.data.shape
|
|
|
|
def _compute_GP_variables(self):
|
|
"""
|
|
Generates data Y which would give the normal distribution identical to the laplace approximation
|
|
|
|
GPy expects a likelihood to be gaussian, so need to caluclate the points Y^{squiggle} and Z^{squiggle}
|
|
that makes the posterior match that found by a laplace approximation to a non-gaussian likelihood
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
def fit_full(self, K):
|
|
"""
|
|
The laplace approximation algorithm
|
|
For nomenclature see Rasmussen & Williams 2006
|
|
:K: Covariance matrix
|
|
"""
|
|
self.f = np.zeros(self.N)
|
|
|
|
#Find \hat(f) using a newton raphson optimizer for example
|
|
|
|
#At this point get the hessian matrix
|
|
|