ENH: Adding SDE representation of addition, sumation and standard periodic kernel.

All changes have been tested tests are added in later commits.
This commit is contained in:
Alexander Grigorievskiy 2015-05-19 14:03:12 +03:00
parent 00e95f957d
commit 06a7fedd22
8 changed files with 477 additions and 82 deletions

View file

@ -723,7 +723,7 @@ class DescreteStateSpace(object):
v*v / S)
log_likelihood_update = log_likelihood_update[0,0] # to make int
if np.isnan(log_likelihood_update):
pass
raise ValueError("Errrrr 1")
LL = None; islower = None
else:
LL,islower = linalg.cho_factor(S)
@ -806,7 +806,7 @@ class DescreteStateSpace(object):
P_upd = K.dot(S).dot(K.T)
P_upd = 0.5*(P_upd + P_upd.T)
P_upd = P_pred - P_upd# this update matrix is symmetric
return m_upd, P_upd, log_likelihood_update, dm_upd, dP_upd, d_log_likelihood_update
@staticmethod
@ -1278,7 +1278,7 @@ class ContDescrStateSpace(DescreteStateSpace):
dQc = None
dH = None
dR = None
# TODO: Defaults for m_init, P_init, dm_init, dP_init. !!!
# Also for dH, dR and probably for all derivatives

View file

@ -25,6 +25,7 @@ import pylab as pb
from GPy.core.parameterization.param import Param
import GPy
from .. import likelihoods
import GPy.models.state_space_main as ssm
#import state_space_main as ssm
reload(ssm)
@ -45,17 +46,16 @@ class StateSpace(Model):
self.Y = Y[sort_index]
# Noise variance
self.sigma2 = Param('Gaussian_noise', sigma2)
self.link_parameter(self.sigma2)
self.likelihood = likelihoods.Gaussian()
# Default kernel
if kernel is None:
self.kern = kern.Matern32(1)
else:
self.kern = kernel
self.link_parameter(self.kern)
self.sigma2.constrain_positive()
self.link_parameter(self.likelihood)
self.posterior = None
# Assert that the kernel is supported
if not hasattr(self.kern, 'sde'):
@ -98,7 +98,7 @@ class StateSpace(Model):
grad_calc_params['dR'] = dR
(filter_means, filter_covs, log_likelihood,
grad_log_likelihood,SmootherMatrObject) = ssm.ContDescrStateSpace.cont_discr_kalman_filter(F,L,Qc,H,self.sigma2,P_inf,self.X,self.Y,m_init=None,
grad_log_likelihood,SmootherMatrObject) = ssm.ContDescrStateSpace.cont_discr_kalman_filter(F,L,Qc,H,self.Gaussian_noise.variance,P_inf,self.X,self.Y,m_init=None,
P_init=None, calc_log_likelihood=True,
calc_grad_log_likelihood=True,
grad_params_no=grad_params_no,
@ -106,9 +106,10 @@ class StateSpace(Model):
self._log_marginal_likelihood = log_likelihood
#gradients = self.compute_gradients()
self.sigma2.gradient_full[:] = grad_log_likelihood[-1,0]
self.kern.gradient_full[:] = grad_log_likelihood[:-1,0]
self.likelihood.update_gradients(grad_log_likelihood[-1,0])
self.kern.sde_update_gradient_full(grad_log_likelihood[:-1,0])
def log_likelihood(self):
return self._log_marginal_likelihood
@ -319,4 +320,4 @@ class StateSpace(Model):
f[:,:,k] = A.dot(f[:,:,k-1]) + np.dot(np.linalg.cholesky(Q),np.random.randn(A.shape[0],size))
# Return values
return f
return f