mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-15 06:52:39 +02:00
Merge branch 'devel' of github.com:SheffieldML/GPy into devel
This commit is contained in:
commit
6877b21fad
2 changed files with 46 additions and 40 deletions
|
|
@ -13,7 +13,7 @@ class DiffGenomeKern(Kern):
|
||||||
self.idx_p = idx_p
|
self.idx_p = idx_p
|
||||||
self.index_dim=index_dim
|
self.index_dim=index_dim
|
||||||
self.kern = SplitKern(kernel,Xp, index_dim=index_dim)
|
self.kern = SplitKern(kernel,Xp, index_dim=index_dim)
|
||||||
super(DiffGenomeKern, self).__init__(input_dim=kernel.input_dim+1, name=name)
|
super(DiffGenomeKern, self).__init__(input_dim=kernel.input_dim+1, active_dims=None, name=name)
|
||||||
self.add_parameter(self.kern)
|
self.add_parameter(self.kern)
|
||||||
|
|
||||||
def K(self, X, X2=None):
|
def K(self, X, X2=None):
|
||||||
|
|
@ -21,10 +21,12 @@ class DiffGenomeKern(Kern):
|
||||||
K = self.kern.K(X,X2)
|
K = self.kern.K(X,X2)
|
||||||
|
|
||||||
slices = index_to_slices(X[:,self.index_dim])
|
slices = index_to_slices(X[:,self.index_dim])
|
||||||
idx_start = slices[1][0]
|
idx_start = slices[1][0].start
|
||||||
idx_end = idx_start+self.idx_p
|
idx_end = idx_start+self.idx_p
|
||||||
|
K_c = K[idx_start:idx_end,idx_start:idx_end].copy()
|
||||||
K[idx_start:idx_end,:] = K[:self.idx_p,:]
|
K[idx_start:idx_end,:] = K[:self.idx_p,:]
|
||||||
K[:,idx_start:idx_end] = K[:,self.idx_p]
|
K[:,idx_start:idx_end] = K[:,:self.idx_p]
|
||||||
|
K[idx_start:idx_end,idx_start:idx_end] = K_c
|
||||||
|
|
||||||
return K
|
return K
|
||||||
|
|
||||||
|
|
@ -32,7 +34,7 @@ class DiffGenomeKern(Kern):
|
||||||
Kdiag = self.kern.Kdiag(X)
|
Kdiag = self.kern.Kdiag(X)
|
||||||
|
|
||||||
slices = index_to_slices(X[:,self.index_dim])
|
slices = index_to_slices(X[:,self.index_dim])
|
||||||
idx_start = slices[1][0]
|
idx_start = slices[1][0].start
|
||||||
idx_end = idx_start+self.idx_p
|
idx_end = idx_start+self.idx_p
|
||||||
Kdiag[idx_start:idx_end] = Kdiag[:self.idx_p]
|
Kdiag[idx_start:idx_end] = Kdiag[:self.idx_p]
|
||||||
|
|
||||||
|
|
@ -41,25 +43,27 @@ class DiffGenomeKern(Kern):
|
||||||
def update_gradients_full(self,dL_dK,X,X2=None):
|
def update_gradients_full(self,dL_dK,X,X2=None):
|
||||||
assert X2==None
|
assert X2==None
|
||||||
slices = index_to_slices(X[:,self.index_dim])
|
slices = index_to_slices(X[:,self.index_dim])
|
||||||
idx_start = slices[1][0]
|
idx_start = slices[1][0].start
|
||||||
idx_end = idx_start+self.idx_p
|
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()
|
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()
|
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()
|
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()
|
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()
|
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()
|
grad_n3 = self.kern.gradient.copy()
|
||||||
|
|
||||||
self.kern.update_gradients_full(dL_dK, X)
|
self.kern.update_gradients_full(dL_dK, X)
|
||||||
self.kern.gradient += grad_p1+grad_p2+grad_p3-grad_n1-grad_n2-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):
|
def update_gradients_diag(self, dL_dKdiag, X):
|
||||||
pass
|
pass
|
||||||
|
|
@ -90,7 +94,7 @@ class SplitKern(CombinationKernel):
|
||||||
assert len(slices2)<=2, 'The Split kernel only support two different indices'
|
assert len(slices2)<=2, 'The Split kernel only support two different indices'
|
||||||
target = np.zeros((X.shape[0], X2.shape[0]))
|
target = np.zeros((X.shape[0], X2.shape[0]))
|
||||||
# diagonal blocks
|
# 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:
|
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])]
|
[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:
|
if len(slices2)>1:
|
||||||
|
|
@ -113,17 +117,19 @@ class SplitKern(CombinationKernel):
|
||||||
target[:] += self.kern.gradient
|
target[:] += self.kern.gradient
|
||||||
|
|
||||||
if X2 is None:
|
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]
|
[[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:
|
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[0], slices[1])]
|
||||||
[collate_grads(dL_dK[s,ss], X[s], X[ss], True) for s,ss in itertools.product(slices[1], slices[0])]
|
[collate_grads(dL_dK[s,ss], X[s], X[ss], True) for s,ss in itertools.product(slices[1], slices[0])]
|
||||||
else:
|
else:
|
||||||
|
assert dL_dK.shape==(X.shape[0],X2.shape[0])
|
||||||
slices2 = index_to_slices(X2[:,self.index_dim])
|
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:
|
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:
|
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
|
self.kern.gradient = target
|
||||||
|
|
||||||
def update_gradients_diag(self, dL_dKdiag, X):
|
def update_gradients_diag(self, dL_dKdiag, X):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue