From 76bfbee5455a331db25cf4d7443ba760bf10d7d4 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Wed, 20 Nov 2013 11:58:30 +0000 Subject: [PATCH] psistattests update --- GPy/kern/kern.py | 3 ++ GPy/testing/psi_stat_expectation_tests.py | 42 +++++++++++------------ GPy/testing/psi_stat_gradient_tests.py | 38 ++++++++++++++------ 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/GPy/kern/kern.py b/GPy/kern/kern.py index 5cd5b6aa..f021dc3a 100644 --- a/GPy/kern/kern.py +++ b/GPy/kern/kern.py @@ -412,6 +412,9 @@ class kern(Parameterized): [p.dpsi0_dtheta(dL_dpsi0, Z[:, i_s], mu[:, i_s], S[:, i_s], target[ps]) for p, ps, i_s in zip(self.parts, self.param_slices, self.input_slices)] return self._transform_gradients(target) + def dpsi0_dZ(self, dL_dpsi0, Z, mu, S): + return np.zeros_like(Z) + def dpsi0_dmuS(self, dL_dpsi0, Z, mu, S): target_mu, target_S = np.zeros_like(mu), np.zeros_like(S) [p.dpsi0_dmuS(dL_dpsi0, Z[:, i_s], mu[:, i_s], S[:, i_s], target_mu[:, i_s], target_S[:, i_s]) for p, i_s in zip(self.parts, self.input_slices)] diff --git a/GPy/testing/psi_stat_expectation_tests.py b/GPy/testing/psi_stat_expectation_tests.py index ae3d1022..90252197 100644 --- a/GPy/testing/psi_stat_expectation_tests.py +++ b/GPy/testing/psi_stat_expectation_tests.py @@ -28,8 +28,8 @@ def ard(p): class Test(unittest.TestCase): input_dim = 9 num_inducing = 13 - N = 30 - Nsamples = 9e6 + N = 300 + Nsamples = 1e6 def setUp(self): i_s_dim_list = [2,4,3] @@ -50,20 +50,20 @@ class Test(unittest.TestCase): # GPy.kern.linear(self.input_dim, ARD=True) + # GPy.kern.bias(self.input_dim) + # GPy.kern.white(self.input_dim)), -# (GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) + - (GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) - +GPy.kern.linear(self.input_dim, np.random.rand(self.input_dim), ARD=True) -# GPy.kern.bias(self.input_dim) + -# GPy.kern.white(self.input_dim)), + (#GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) + GPy.kern.linear(self.input_dim, np.random.rand(self.input_dim), ARD=True) + +GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) +# +GPy.kern.bias(self.input_dim) +# +GPy.kern.white(self.input_dim)), ), - (GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) - +GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) - #+GPy.kern.bias(self.input_dim, np.random.rand()) - #+GPy.kern.white(self.input_dim, np.random.rand())), - ), - (GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) + - GPy.kern.bias(self.input_dim, np.random.rand()) + - GPy.kern.white(self.input_dim, np.random.rand())), +# (GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) + +# GPy.kern.bias(self.input_dim, np.random.rand())), +# (GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) +# +GPy.kern.rbf(self.input_dim, np.random.rand(), np.random.rand(self.input_dim), ARD=True) +# #+GPy.kern.bias(self.input_dim, np.random.rand()) +# #+GPy.kern.white(self.input_dim, np.random.rand())), +# ), +# GPy.kern.white(self.input_dim, np.random.rand())), # GPy.kern.rbf(self.input_dim), GPy.kern.rbf(self.input_dim, ARD=True), # GPy.kern.linear(self.input_dim, ARD=False), GPy.kern.linear(self.input_dim, ARD=True), # GPy.kern.linear(self.input_dim) + GPy.kern.bias(self.input_dim), @@ -120,25 +120,25 @@ class Test(unittest.TestCase): diffs = [] for i, q_x_sample_stripe in enumerate(np.array_split(self.q_x_samples, self.Nsamples / Nsamples)): K = kern.K(q_x_sample_stripe, self.Z) - K = (K[:, :, None] * K[:, None, :]).mean(0) - K_ += K - diffs.append(((psi2 - (K_ / (i + 1)))**2).mean()) - K_ /= self.Nsamples / Nsamples + K = (K[:, :, None] * K[:, None, :]) + K_ += K.sum(0) / self.Nsamples + diffs.append(((psi2 - (K_*self.Nsamples/((i+1)*Nsamples)))**2).mean()) + #K_ /= self.Nsamples / Nsamples msg = "psi2: {}".format("+".join([p.name + ard(p) for p in kern.parts])) try: import pylab pylab.figure(msg) - pylab.plot(diffs, marker='x', mew=1.3) + pylab.plot(diffs, marker='x', mew=.2) # print msg, np.allclose(psi2.squeeze(), K_, rtol=1e-1, atol=.1) self.assertTrue(np.allclose(psi2.squeeze(), K_), #rtol=1e-1, atol=.1), msg=msg + ": not matching") # sys.stdout.write(".") except: -# import ipdb;ipdb.set_trace() # kern.psi2(self.Z, self.q_x_mean, self.q_x_variance) # sys.stdout.write("E") print msg + ": not matching" + import ipdb;ipdb.set_trace() pass if __name__ == "__main__": diff --git a/GPy/testing/psi_stat_gradient_tests.py b/GPy/testing/psi_stat_gradient_tests.py index de670f41..edb0f02e 100644 --- a/GPy/testing/psi_stat_gradient_tests.py +++ b/GPy/testing/psi_stat_gradient_tests.py @@ -40,10 +40,9 @@ class PsiStatModel(Model): return self.kern.__getattribute__(self.which)(self.Z, self.X, self.X_variance).sum() def _log_likelihood_gradients(self): psimu, psiS = self.kern.__getattribute__("d" + self.which + "_dmuS")(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(self.num_inducing * 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) + #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() return numpy.hstack((psimu.flatten(), psiS.flatten(), psiZ.flatten(), thetagrad)) @@ -116,9 +115,9 @@ if __name__ == "__main__": # m.randomize() # # self.assertTrue(m.checkgrad()) numpy.random.seed(0) - input_dim = 5 - N = 50 - num_inducing = 10 + input_dim = 3 + N = 3 + num_inducing = 2 D = 15 X = numpy.random.randn(N, input_dim) X_var = .5 * numpy.ones_like(X) + .1 * numpy.clip(numpy.random.randn(*X.shape), 0, 1) @@ -143,10 +142,27 @@ if __name__ == "__main__": # num_inducing=num_inducing, kernel=kernel) # m2 = PsiStatModel('psi2', X=X, X_variance=X_var, Z=Z, # num_inducing=num_inducing, kernel=GPy.kern.rbf(input_dim)) - m3 = PsiStatModel('psi2', X=X, X_variance=X_var, Z=Z, - num_inducing=num_inducing, kernel=GPy.kern.linear(input_dim, ARD=True, variances=numpy.random.rand(input_dim))) +# m3 = PsiStatModel('psi2', X=X, X_variance=X_var, Z=Z, +# num_inducing=num_inducing, kernel=GPy.kern.linear(input_dim, ARD=True, variances=numpy.random.rand(input_dim))) # + GPy.kern.bias(input_dim)) -# m4 = PsiStatModel('psi2', X=X, X_variance=X_var, Z=Z, -# num_inducing=num_inducing, kernel=GPy.kern.rbf(input_dim) + GPy.kern.bias(input_dim)) +# m = PsiStatModel('psi2', X=X, X_variance=X_var, Z=Z, +# num_inducing=num_inducing, +# kernel=( +# GPy.kern.rbf(input_dim, ARD=1) +# +GPy.kern.linear(input_dim, ARD=1) +# +GPy.kern.bias(input_dim)) +# ) +# m.ensure_default_constraints() + m2 = PsiStatModel('psi2', X=X, X_variance=X_var, Z=Z, + num_inducing=num_inducing, kernel=( + GPy.kern.rbf(input_dim, numpy.random.rand(), numpy.random.rand(input_dim), ARD=1) + #+GPy.kern.linear(input_dim, numpy.random.rand(input_dim), ARD=1) + #+GPy.kern.rbf(input_dim, numpy.random.rand(), numpy.random.rand(input_dim), ARD=1) + #+GPy.kern.rbf(input_dim, numpy.random.rand(), numpy.random.rand(), ARD=0) + +GPy.kern.bias(input_dim) + +GPy.kern.white(input_dim) + ) + ) + m2.ensure_default_constraints() else: unittest.main()