mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-21 14:05:14 +02:00
Fixing broken kernels due to the add_parameter --> link_parameter rename
This commit is contained in:
parent
bb1bc50886
commit
cc9d22cea2
3 changed files with 24 additions and 24 deletions
|
|
@ -14,15 +14,15 @@ class DEtime(Kern):
|
||||||
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(DEtime, self).__init__(input_dim=kernel.input_dim+1, active_dims=None, name=name)
|
super(DEtime, self).__init__(input_dim=kernel.input_dim+1, active_dims=None, name=name)
|
||||||
self.add_parameter(self.kern)
|
self.link_parameter(self.kern)
|
||||||
|
|
||||||
def K(self, X, X2=None):
|
def K(self, X, X2=None):
|
||||||
assert X2==None
|
assert X2==None
|
||||||
K = self.kern.K(X,X2)
|
K = self.kern.K(X,X2)
|
||||||
|
|
||||||
if self.idx_p<=0 or self.idx_p>X.shape[0]/2:
|
if self.idx_p<=0 or self.idx_p>X.shape[0]/2:
|
||||||
return K
|
return K
|
||||||
|
|
||||||
slices = index_to_slices(X[:,self.index_dim])
|
slices = index_to_slices(X[:,self.index_dim])
|
||||||
idx_start = slices[1][0].start
|
idx_start = slices[1][0].start
|
||||||
idx_end = idx_start+self.idx_p
|
idx_end = idx_start+self.idx_p
|
||||||
|
|
@ -30,9 +30,9 @@ class DEtime(Kern):
|
||||||
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
|
K[idx_start:idx_end,idx_start:idx_end] = K_c
|
||||||
|
|
||||||
return K
|
return K
|
||||||
|
|
||||||
def Kdiag(self,X):
|
def Kdiag(self,X):
|
||||||
Kdiag = self.kern.Kdiag(X)
|
Kdiag = self.kern.Kdiag(X)
|
||||||
|
|
||||||
|
|
@ -43,19 +43,19 @@ class DEtime(Kern):
|
||||||
idx_start = slices[1][0].start
|
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]
|
||||||
|
|
||||||
return Kdiag
|
return Kdiag
|
||||||
|
|
||||||
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
|
||||||
if self.idx_p<=0 or self.idx_p>X.shape[0]/2:
|
if self.idx_p<=0 or self.idx_p>X.shape[0]/2:
|
||||||
self.kern.update_gradients_full(dL_dK, X)
|
self.kern.update_gradients_full(dL_dK, X)
|
||||||
return
|
return
|
||||||
|
|
||||||
slices = index_to_slices(X[:,self.index_dim])
|
slices = index_to_slices(X[:,self.index_dim])
|
||||||
idx_start = slices[1][0].start
|
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[idx_start:idx_end,:], 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[:,idx_start:idx_end], X, X[:self.idx_p])
|
self.kern.update_gradients_full(dL_dK[:,idx_start:idx_end], X, X[:self.idx_p])
|
||||||
|
|
@ -108,7 +108,7 @@ class SplitKern(CombinationKernel):
|
||||||
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:
|
||||||
[target.__setitem__((s,s2), self.kern_cross.K(X[s,:],X2[s2,:])) for s,s2 in itertools.product(slices[0], slices2[1])]
|
[target.__setitem__((s,s2), self.kern_cross.K(X[s,:],X2[s2,:])) for s,s2 in itertools.product(slices[0], slices2[1])]
|
||||||
return target
|
return target
|
||||||
|
|
||||||
def Kdiag(self,X):
|
def Kdiag(self,X):
|
||||||
|
|
@ -125,7 +125,7 @@ class SplitKern(CombinationKernel):
|
||||||
else:
|
else:
|
||||||
self.kern.update_gradients_full(dL,X,X2)
|
self.kern.update_gradients_full(dL,X,X2)
|
||||||
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])
|
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]
|
||||||
|
|
@ -154,20 +154,20 @@ class SplitKern_cross(Kern):
|
||||||
Xp = np.array([[Xp]])
|
Xp = np.array([[Xp]])
|
||||||
self.Xp = Xp
|
self.Xp = Xp
|
||||||
super(SplitKern_cross, self).__init__(input_dim=kernel.input_dim, active_dims=None, name=name)
|
super(SplitKern_cross, self).__init__(input_dim=kernel.input_dim, active_dims=None, name=name)
|
||||||
|
|
||||||
def K(self, X, X2=None):
|
def K(self, X, X2=None):
|
||||||
if X2 is None:
|
if X2 is None:
|
||||||
return np.dot(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X))/self.kern.K(self.Xp,self.Xp)
|
return np.dot(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X))/self.kern.K(self.Xp,self.Xp)
|
||||||
else:
|
else:
|
||||||
return np.dot(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X2))/self.kern.K(self.Xp,self.Xp)
|
return np.dot(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X2))/self.kern.K(self.Xp,self.Xp)
|
||||||
|
|
||||||
def Kdiag(self, X):
|
def Kdiag(self, X):
|
||||||
return np.inner(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X).T)/self.kern.K(self.Xp,self.Xp)
|
return np.inner(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X).T)/self.kern.K(self.Xp,self.Xp)
|
||||||
|
|
||||||
def update_gradients_full(self, dL_dK, X, X2=None):
|
def update_gradients_full(self, dL_dK, X, X2=None):
|
||||||
if X2 is None:
|
if X2 is None:
|
||||||
X2 = X
|
X2 = X
|
||||||
|
|
||||||
k1 = self.kern.K(X,self.Xp)
|
k1 = self.kern.K(X,self.Xp)
|
||||||
k2 = self.kern.K(self.Xp,X2)
|
k2 = self.kern.K(self.Xp,X2)
|
||||||
k3 = self.kern.K(self.Xp,self.Xp)
|
k3 = self.kern.K(self.Xp,self.Xp)
|
||||||
|
|
@ -181,7 +181,7 @@ class SplitKern_cross(Kern):
|
||||||
grad += self.kern.gradient.copy()
|
grad += self.kern.gradient.copy()
|
||||||
self.kern.update_gradients_full(np.array([[dL_dk3]]),self.Xp,self.Xp)
|
self.kern.update_gradients_full(np.array([[dL_dk3]]),self.Xp,self.Xp)
|
||||||
grad += self.kern.gradient.copy()
|
grad += self.kern.gradient.copy()
|
||||||
|
|
||||||
self.kern.gradient = grad
|
self.kern.gradient = grad
|
||||||
|
|
||||||
def update_gradients_diag(self, dL_dKdiag, X):
|
def update_gradients_diag(self, dL_dKdiag, X):
|
||||||
|
|
@ -191,14 +191,14 @@ class SplitKern_cross(Kern):
|
||||||
dL_dk1 = dL_dKdiag*k2[0]/k3
|
dL_dk1 = dL_dKdiag*k2[0]/k3
|
||||||
dL_dk2 = dL_dKdiag*k1[:,0]/k3
|
dL_dk2 = dL_dKdiag*k1[:,0]/k3
|
||||||
dL_dk3 = -dL_dKdiag*(k1[:,0]*k2[0]).sum()/(k3*k3)
|
dL_dk3 = -dL_dKdiag*(k1[:,0]*k2[0]).sum()/(k3*k3)
|
||||||
|
|
||||||
self.kern.update_gradients_full(dL_dk1[:,None],X,self.Xp)
|
self.kern.update_gradients_full(dL_dk1[:,None],X,self.Xp)
|
||||||
grad1 = self.kern.gradient.copy()
|
grad1 = self.kern.gradient.copy()
|
||||||
self.kern.update_gradients_full(dL_dk2[None,:],self.Xp,X)
|
self.kern.update_gradients_full(dL_dk2[None,:],self.Xp,X)
|
||||||
grad2 = self.kern.gradient.copy()
|
grad2 = self.kern.gradient.copy()
|
||||||
self.kern.update_gradients_full(np.array([[dL_dk3]]),self.Xp,self.Xp)
|
self.kern.update_gradients_full(np.array([[dL_dk3]]),self.Xp,self.Xp)
|
||||||
grad3 = self.kern.gradient.copy()
|
grad3 = self.kern.gradient.copy()
|
||||||
|
|
||||||
self.kern.gradient = grad1+grad2+grad3
|
self.kern.gradient = grad1+grad2+grad3
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ class Symmetric(Kernpart):
|
||||||
self.num_params = k.num_params
|
self.num_params = k.num_params
|
||||||
self.name = k.name + '_symm'
|
self.name = k.name + '_symm'
|
||||||
self.k = k
|
self.k = k
|
||||||
self.add_parameter(k)
|
self.link_parameter(k)
|
||||||
#self._set_params(k._get_params())
|
#self._set_params(k._get_params())
|
||||||
|
|
||||||
def K(self,X,X2,target):
|
def K(self,X,X2,target):
|
||||||
|
|
|
||||||
|
|
@ -51,8 +51,8 @@ class TruncLinear(Kern):
|
||||||
|
|
||||||
self.variances = Param('variances', variances, Logexp())
|
self.variances = Param('variances', variances, Logexp())
|
||||||
self.delta = Param('delta', delta)
|
self.delta = Param('delta', delta)
|
||||||
self.add_parameter(self.variances)
|
self.link_parameter(self.variances)
|
||||||
self.add_parameter(self.delta)
|
self.link_parameter(self.delta)
|
||||||
|
|
||||||
@Cache_this(limit=3)
|
@Cache_this(limit=3)
|
||||||
def K(self, X, X2=None):
|
def K(self, X, X2=None):
|
||||||
|
|
@ -146,7 +146,7 @@ class TruncLinear_inf(Kern):
|
||||||
variances = np.ones(self.input_dim)
|
variances = np.ones(self.input_dim)
|
||||||
|
|
||||||
self.variances = Param('variances', variances, Logexp())
|
self.variances = Param('variances', variances, Logexp())
|
||||||
self.add_parameter(self.variances)
|
self.link_parameter(self.variances)
|
||||||
|
|
||||||
|
|
||||||
# @Cache_this(limit=3)
|
# @Cache_this(limit=3)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue