mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-12 05:22:38 +02:00
psi stat and kernel tests new parameterization
This commit is contained in:
parent
9e1546524e
commit
6a1c700c03
2 changed files with 47 additions and 40 deletions
|
|
@ -5,7 +5,7 @@ import unittest
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import GPy
|
import GPy
|
||||||
|
|
||||||
verbose = False
|
verbose = True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import sympy
|
import sympy
|
||||||
|
|
|
||||||
|
|
@ -9,42 +9,44 @@ import numpy
|
||||||
import GPy
|
import GPy
|
||||||
import itertools
|
import itertools
|
||||||
from GPy.core import Model
|
from GPy.core import Model
|
||||||
|
from GPy.core.parameterization.param import Param
|
||||||
|
from GPy.core.parameterization.transformations import Logexp
|
||||||
|
|
||||||
class PsiStatModel(Model):
|
class PsiStatModel(Model):
|
||||||
def __init__(self, which, X, X_variance, Z, num_inducing, kernel):
|
def __init__(self, which, X, X_variance, Z, num_inducing, kernel):
|
||||||
|
super(PsiStatModel, self).__init__(name='psi stat test')
|
||||||
self.which = which
|
self.which = which
|
||||||
self.X = X
|
self.X = Param("X", X)
|
||||||
self.X_variance = X_variance
|
self.X_variance = Param('X_variance', X_variance, Logexp())
|
||||||
self.Z = Z
|
self.Z = Param("Z", Z)
|
||||||
self.N, self.input_dim = X.shape
|
self.N, self.input_dim = X.shape
|
||||||
self.num_inducing, input_dim = Z.shape
|
self.num_inducing, input_dim = Z.shape
|
||||||
assert self.input_dim == input_dim, "shape missmatch: Z:{!s} X:{!s}".format(Z.shape, X.shape)
|
assert self.input_dim == input_dim, "shape missmatch: Z:{!s} X:{!s}".format(Z.shape, X.shape)
|
||||||
self.kern = kernel
|
self.kern = kernel
|
||||||
super(PsiStatModel, self).__init__()
|
|
||||||
self.psi_ = self.kern.__getattribute__(self.which)(self.Z, self.X, self.X_variance)
|
self.psi_ = self.kern.__getattribute__(self.which)(self.Z, self.X, self.X_variance)
|
||||||
def _get_param_names(self):
|
self.add_parameters(self.X, self.X_variance, self.Z, self.kern)
|
||||||
Xnames = ["{}_{}_{}".format(what, i, j) for what, i, j in itertools.product(['X', 'X_variance'], range(self.N), range(self.input_dim))]
|
|
||||||
Znames = ["Z_{}_{}".format(i, j) for i, j in itertools.product(range(self.num_inducing), range(self.input_dim))]
|
|
||||||
return Xnames + Znames + self.kern._get_param_names()
|
|
||||||
def _get_params(self):
|
|
||||||
return numpy.hstack([self.X.flatten(), self.X_variance.flatten(), self.Z.flatten(), self.kern._get_params()])
|
|
||||||
def _set_params(self, x, save_old=True, save_count=0):
|
|
||||||
start, end = 0, self.X.size
|
|
||||||
self.X = x[start:end].reshape(self.N, self.input_dim)
|
|
||||||
start, end = end, end + self.X_variance.size
|
|
||||||
self.X_variance = x[start: end].reshape(self.N, self.input_dim)
|
|
||||||
start, end = end, end + self.Z.size
|
|
||||||
self.Z = x[start: end].reshape(self.num_inducing, self.input_dim)
|
|
||||||
self.kern._set_params(x[end:])
|
|
||||||
def log_likelihood(self):
|
def log_likelihood(self):
|
||||||
return self.kern.__getattribute__(self.which)(self.Z, self.X, self.X_variance).sum()
|
return self.kern.__getattribute__(self.which)(self.Z, self.X, self.X_variance).sum()
|
||||||
def _log_likelihood_gradients(self):
|
|
||||||
|
def parameters_changed(self):
|
||||||
psimu, psiS = self.kern.__getattribute__("d" + self.which + "_dmuS")(numpy.ones_like(self.psi_), self.Z, self.X, self.X_variance)
|
psimu, psiS = self.kern.__getattribute__("d" + self.which + "_dmuS")(numpy.ones_like(self.psi_), self.Z, self.X, self.X_variance)
|
||||||
|
self.X.gradient = psimu
|
||||||
|
self.X_variance.gradient = psiS
|
||||||
#psimu, psiS = numpy.ones(self.N * self.input_dim), numpy.ones(self.N * self.input_dim)
|
#psimu, psiS = numpy.ones(self.N * self.input_dim), numpy.ones(self.N * self.input_dim)
|
||||||
psiZ = self.kern.__getattribute__("d" + self.which + "_dZ")(numpy.ones_like(self.psi_), self.Z, self.X, self.X_variance)
|
try: psiZ = self.kern.__getattribute__("d" + self.which + "_dZ")(numpy.ones_like(self.psi_), self.Z, self.X, self.X_variance)
|
||||||
|
except AttributeError: psiZ = numpy.zeros_like(self.Z)
|
||||||
|
self.Z.gradient = psiZ
|
||||||
#psiZ = numpy.ones(self.num_inducing * self.input_dim)
|
#psiZ = numpy.ones(self.num_inducing * self.input_dim)
|
||||||
thetagrad = self.kern.__getattribute__("d" + self.which + "_dtheta")(numpy.ones_like(self.psi_), self.Z, self.X, self.X_variance).flatten()
|
N,M = self.X.shape[0], self.Z.shape[0]
|
||||||
return numpy.hstack((psimu.flatten(), psiS.flatten(), psiZ.flatten(), thetagrad))
|
dL_dpsi0, dL_dpsi1, dL_dpsi2 = numpy.zeros([N]), numpy.zeros([N,M]), numpy.zeros([N,M,M])
|
||||||
|
if self.which == 'psi0': dL_dpsi0 += 1
|
||||||
|
if self.which == 'psi1': dL_dpsi1 += 1
|
||||||
|
if self.which == 'psi2': dL_dpsi2 += 1
|
||||||
|
self.kern.update_gradients_variational(numpy.zeros([1,1]),
|
||||||
|
dL_dpsi0,
|
||||||
|
dL_dpsi1,
|
||||||
|
dL_dpsi2, self.X, self.X_variance, self.Z)
|
||||||
|
|
||||||
class DPsiStatTest(unittest.TestCase):
|
class DPsiStatTest(unittest.TestCase):
|
||||||
input_dim = 5
|
input_dim = 5
|
||||||
|
|
@ -57,61 +59,66 @@ class DPsiStatTest(unittest.TestCase):
|
||||||
Y = X.dot(numpy.random.randn(input_dim, input_dim))
|
Y = X.dot(numpy.random.randn(input_dim, input_dim))
|
||||||
# kernels = [GPy.kern.linear(input_dim, ARD=True, variances=numpy.random.rand(input_dim)), GPy.kern.rbf(input_dim, ARD=True), GPy.kern.bias(input_dim)]
|
# kernels = [GPy.kern.linear(input_dim, ARD=True, variances=numpy.random.rand(input_dim)), GPy.kern.rbf(input_dim, ARD=True), GPy.kern.bias(input_dim)]
|
||||||
|
|
||||||
kernels = [GPy.kern.linear(input_dim), GPy.kern.rbf(input_dim), GPy.kern.bias(input_dim),
|
kernels = [
|
||||||
GPy.kern.linear(input_dim) + GPy.kern.bias(input_dim),
|
GPy.kern.linear(input_dim),
|
||||||
GPy.kern.rbf(input_dim) + GPy.kern.bias(input_dim)]
|
GPy.kern.rbf(input_dim),
|
||||||
|
#GPy.kern.bias(input_dim),
|
||||||
|
#GPy.kern.linear(input_dim) + GPy.kern.bias(input_dim),
|
||||||
|
#GPy.kern.rbf(input_dim) + GPy.kern.bias(input_dim)
|
||||||
|
]
|
||||||
|
|
||||||
def testPsi0(self):
|
def testPsi0(self):
|
||||||
for k in self.kernels:
|
for k in self.kernels:
|
||||||
m = PsiStatModel('psi0', X=self.X, X_variance=self.X_var, Z=self.Z,\
|
m = PsiStatModel('psi0', X=self.X, X_variance=self.X_var, Z=self.Z,\
|
||||||
num_inducing=self.num_inducing, kernel=k)
|
num_inducing=self.num_inducing, kernel=k)
|
||||||
m.ensure_default_constraints()
|
#m.ensure_default_constraints(warning=0)
|
||||||
m.randomize()
|
m.randomize()
|
||||||
assert m.checkgrad(), "{} x psi0".format("+".join(map(lambda x: x.name, k.parts)))
|
import ipdb;ipdb.set_trace()
|
||||||
|
assert m.checkgrad(), "{} x psi0".format("+".join(map(lambda x: x.name, k._parameters_)))
|
||||||
|
|
||||||
def testPsi1(self):
|
def testPsi1(self):
|
||||||
for k in self.kernels:
|
for k in self.kernels:
|
||||||
m = PsiStatModel('psi1', X=self.X, X_variance=self.X_var, Z=self.Z,
|
m = PsiStatModel('psi1', X=self.X, X_variance=self.X_var, Z=self.Z,
|
||||||
num_inducing=self.num_inducing, kernel=k)
|
num_inducing=self.num_inducing, kernel=k)
|
||||||
m.ensure_default_constraints()
|
m.ensure_default_constraints(warning=0)
|
||||||
m.randomize()
|
m.randomize()
|
||||||
assert m.checkgrad(), "{} x psi1".format("+".join(map(lambda x: x.name, k.parts)))
|
assert m.checkgrad(), "{} x psi1".format("+".join(map(lambda x: x.name, k._parameters_)))
|
||||||
|
|
||||||
def testPsi2_lin(self):
|
def testPsi2_lin(self):
|
||||||
k = self.kernels[0]
|
k = self.kernels[0]
|
||||||
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
||||||
num_inducing=self.num_inducing, kernel=k)
|
num_inducing=self.num_inducing, kernel=k)
|
||||||
m.ensure_default_constraints()
|
m.ensure_default_constraints(warning=0)
|
||||||
m.randomize()
|
m.randomize()
|
||||||
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k.parts)))
|
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k._parameters_)))
|
||||||
def testPsi2_lin_bia(self):
|
def testPsi2_lin_bia(self):
|
||||||
k = self.kernels[3]
|
k = self.kernels[3]
|
||||||
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
||||||
num_inducing=self.num_inducing, kernel=k)
|
num_inducing=self.num_inducing, kernel=k)
|
||||||
m.ensure_default_constraints()
|
m.ensure_default_constraints(warning=0)
|
||||||
m.randomize()
|
m.randomize()
|
||||||
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k.parts)))
|
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k._parameters_)))
|
||||||
def testPsi2_rbf(self):
|
def testPsi2_rbf(self):
|
||||||
k = self.kernels[1]
|
k = self.kernels[1]
|
||||||
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
||||||
num_inducing=self.num_inducing, kernel=k)
|
num_inducing=self.num_inducing, kernel=k)
|
||||||
m.ensure_default_constraints()
|
m.ensure_default_constraints(warning=0)
|
||||||
m.randomize()
|
m.randomize()
|
||||||
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k.parts)))
|
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k._parameters_)))
|
||||||
def testPsi2_rbf_bia(self):
|
def testPsi2_rbf_bia(self):
|
||||||
k = self.kernels[-1]
|
k = self.kernels[-1]
|
||||||
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
||||||
num_inducing=self.num_inducing, kernel=k)
|
num_inducing=self.num_inducing, kernel=k)
|
||||||
m.ensure_default_constraints()
|
m.ensure_default_constraints(warning=0)
|
||||||
m.randomize()
|
m.randomize()
|
||||||
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k.parts)))
|
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k._parameters_)))
|
||||||
def testPsi2_bia(self):
|
def testPsi2_bia(self):
|
||||||
k = self.kernels[2]
|
k = self.kernels[2]
|
||||||
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
m = PsiStatModel('psi2', X=self.X, X_variance=self.X_var, Z=self.Z,
|
||||||
num_inducing=self.num_inducing, kernel=k)
|
num_inducing=self.num_inducing, kernel=k)
|
||||||
m.ensure_default_constraints()
|
m.ensure_default_constraints(warning=0)
|
||||||
m.randomize()
|
m.randomize()
|
||||||
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k.parts)))
|
assert m.checkgrad(), "{} x psi2".format("+".join(map(lambda x: x.name, k._parameters_)))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue