From 4c538efb64192470449b6c7247d0b445f4404e5a Mon Sep 17 00:00:00 2001 From: Zhenwen Dai Date: Thu, 29 May 2014 17:10:14 +0100 Subject: [PATCH] DiffGenomeKern bug fix --- GPy/kern/_src/splitKern.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/GPy/kern/_src/splitKern.py b/GPy/kern/_src/splitKern.py index 54a08914..624bae58 100644 --- a/GPy/kern/_src/splitKern.py +++ b/GPy/kern/_src/splitKern.py @@ -6,6 +6,7 @@ import numpy as np from kern import Kern,CombinationKernel from .independent_outputs import index_to_slices import itertools +from .rbf import RBF class DiffGenomeKern(Kern): @@ -13,6 +14,7 @@ class DiffGenomeKern(Kern): self.idx_p = idx_p self.index_dim=index_dim self.kern = SplitKern(kernel,Xp, index_dim=index_dim) +# self.kern = RBF(1) super(DiffGenomeKern, self).__init__(input_dim=kernel.input_dim+1, active_dims=None, name=name) self.add_parameter(self.kern) @@ -46,22 +48,24 @@ class DiffGenomeKern(Kern): idx_start = slices[1][0].start idx_end = idx_start+self.idx_p - self.kern.update_gradients_full(dL_dK, X[:self.idx_p],X) + self.kern.update_gradients_full(dL_dK[idx_start:idx_end,:], X[:self.idx_p],X) grad_p1 = self.kern.gradient.copy() - self.kern.update_gradients_full(dL_dK, X, X[:self.idx_p]) + self.kern.update_gradients_full(dL_dK[:,idx_start:idx_end], X, X[:self.idx_p]) grad_p2 = self.kern.gradient.copy() - self.kern.update_gradients_full(dL_dK, X[:self.idx_p], X[:self.idx_p]) + self.kern.update_gradients_full(dL_dK[idx_start:idx_end,idx_start:idx_end], X[:self.idx_p],X[idx_start:idx_end]) grad_p3 = self.kern.gradient.copy() + self.kern.update_gradients_full(dL_dK[idx_start:idx_end,idx_start:idx_end], X[idx_start:idx_end], X[:self.idx_p]) + grad_p4 = self.kern.gradient.copy() - self.kern.update_gradients_full(dL_dK, X[idx_start:idx_end],X) + self.kern.update_gradients_full(dL_dK[idx_start:idx_end,:], X[idx_start:idx_end],X) grad_n1 = self.kern.gradient.copy() - self.kern.update_gradients_full(dL_dK, X, X[idx_start:idx_end]) + self.kern.update_gradients_full(dL_dK[:,idx_start:idx_end], X, X[idx_start:idx_end]) grad_n2 = self.kern.gradient.copy() - self.kern.update_gradients_full(dL_dK, X[idx_start:idx_end], X[idx_start:idx_end]) + self.kern.update_gradients_full(dL_dK[idx_start:idx_end,idx_start:idx_end], X[idx_start:idx_end], X[idx_start:idx_end]) grad_n3 = self.kern.gradient.copy() self.kern.update_gradients_full(dL_dK, X) - self.kern.gradient += grad_p1+grad_p2-2*grad_p3-grad_n1-grad_n2+2*grad_n3 + self.kern.gradient += grad_p1+grad_p2-grad_p3-grad_p4-grad_n1-grad_n2+2*grad_n3 def update_gradients_diag(self, dL_dKdiag, X): pass @@ -92,7 +96,7 @@ class SplitKern(CombinationKernel): assert len(slices2)<=2, 'The Split kernel only support two different indices' target = np.zeros((X.shape[0], X2.shape[0])) # diagonal blocks - [[target.__setitem__((s,s2), self.kern.K(X[s,:],X2[s2,:])) for s,s2 in itertools.product(slices[i], slices2[i])] for i in xrange(min(len(slices),len(slices)))] + [[target.__setitem__((s,s2), self.kern.K(X[s,:],X2[s2,:])) for s,s2 in itertools.product(slices[i], slices2[i])] for i in xrange(min(len(slices),len(slices2)))] if len(slices)>1: [target.__setitem__((s,s2), self.kern_cross.K(X[s,:],X2[s2,:])) for s,s2 in itertools.product(slices[1], slices2[0])] if len(slices2)>1: @@ -115,17 +119,19 @@ class SplitKern(CombinationKernel): target[:] += self.kern.gradient if X2 is None: + assert dL_dK.shape==(X.shape[0],X.shape[0]) [[collate_grads(dL_dK[s,ss], X[s], X[ss]) for s,ss in itertools.product(slices_i, slices_i)] for slices_i in slices] if len(slices)>1: [collate_grads(dL_dK[s,ss], X[s], X[ss], True) for s,ss in itertools.product(slices[0], slices[1])] [collate_grads(dL_dK[s,ss], X[s], X[ss], True) for s,ss in itertools.product(slices[1], slices[0])] else: + assert dL_dK.shape==(X.shape[0],X2.shape[0]) slices2 = index_to_slices(X2[:,self.index_dim]) - [[collate_grads(dL_dK[s,s2],X[s],X2[s2]) for s,s2 in itertools.product(slices[i], slices2[i])] for i in xrange(min(len(slices),len(slices)))] + [[collate_grads(dL_dK[s,s2],X[s],X2[s2]) for s,s2 in itertools.product(slices[i], slices2[i])] for i in xrange(min(len(slices),len(slices2)))] if len(slices)>1: - [collate_grads(dL_dK[s,ss], X[s], X2[s2], True) for s,s2 in itertools.product(slices[1], slices2[0])] + [collate_grads(dL_dK[s,s2], X[s], X2[s2], True) for s,s2 in itertools.product(slices[1], slices2[0])] if len(slices2)>1: - [collate_grads(dL_dK[s,ss], X[s], X2[s2], True) for s,s2 in itertools.product(slices[0], slices2[1])] + [collate_grads(dL_dK[s,s2], X[s], X2[s2], True) for s,s2 in itertools.product(slices[0], slices2[1])] self.kern.gradient = target def update_gradients_diag(self, dL_dKdiag, X):