mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-15 06:52:39 +02:00
fix pickle
This commit is contained in:
parent
17b6b94db3
commit
e6d07ad5ac
7 changed files with 230 additions and 275 deletions
|
|
@ -26,7 +26,7 @@ class VarDTC_minibatch(LatentFunctionInference):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
const_jitter = 1e-6
|
const_jitter = 1e-6
|
||||||
def __init__(self, batchsize, limit=1, mpi_comm=None):
|
def __init__(self, batchsize=None, limit=1, mpi_comm=None):
|
||||||
|
|
||||||
self.batchsize = batchsize
|
self.batchsize = batchsize
|
||||||
self.mpi_comm = mpi_comm
|
self.mpi_comm = mpi_comm
|
||||||
|
|
@ -78,6 +78,9 @@ class VarDTC_minibatch(LatentFunctionInference):
|
||||||
num_inducing = Z.shape[0]
|
num_inducing = Z.shape[0]
|
||||||
num_data, output_dim = Y.shape
|
num_data, output_dim = Y.shape
|
||||||
|
|
||||||
|
if self.batchsize == None or self.batchsize>num_data:
|
||||||
|
self.batchsize = num_data
|
||||||
|
|
||||||
trYYT = self.get_trYYT(Y)
|
trYYT = self.get_trYYT(Y)
|
||||||
|
|
||||||
psi2_full = np.zeros((num_inducing,num_inducing))
|
psi2_full = np.zeros((num_inducing,num_inducing))
|
||||||
|
|
|
||||||
|
|
@ -111,20 +111,20 @@ class Linear(Kern):
|
||||||
|
|
||||||
def psi0(self, Z, variational_posterior):
|
def psi0(self, Z, variational_posterior):
|
||||||
if isinstance(variational_posterior, variational.SpikeAndSlabPosterior):
|
if isinstance(variational_posterior, variational.SpikeAndSlabPosterior):
|
||||||
return self.psicomp.psicomputations(self.variances, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[0]
|
return self.psicomp.psicomputations(self.variances, Z, variational_posterior)[0]
|
||||||
else:
|
else:
|
||||||
return np.sum(self.variances * self._mu2S(variational_posterior), 1)
|
return np.sum(self.variances * self._mu2S(variational_posterior), 1)
|
||||||
|
|
||||||
def psi1(self, Z, variational_posterior):
|
def psi1(self, Z, variational_posterior):
|
||||||
if isinstance(variational_posterior, variational.SpikeAndSlabPosterior):
|
if isinstance(variational_posterior, variational.SpikeAndSlabPosterior):
|
||||||
return self.psicomp.psicomputations(self.variances, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[1]
|
return self.psicomp.psicomputations(self.variances, Z, variational_posterior)[1]
|
||||||
else:
|
else:
|
||||||
return self.K(variational_posterior.mean, Z) #the variance, it does nothing
|
return self.K(variational_posterior.mean, Z) #the variance, it does nothing
|
||||||
|
|
||||||
@Cache_this(limit=1)
|
@Cache_this(limit=1)
|
||||||
def psi2(self, Z, variational_posterior):
|
def psi2(self, Z, variational_posterior):
|
||||||
if isinstance(variational_posterior, variational.SpikeAndSlabPosterior):
|
if isinstance(variational_posterior, variational.SpikeAndSlabPosterior):
|
||||||
return self.psicomp.psicomputations(self.variances, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[2]
|
return self.psicomp.psicomputations(self.variances, Z, variational_posterior)[2]
|
||||||
else:
|
else:
|
||||||
ZA = Z * self.variances
|
ZA = Z * self.variances
|
||||||
ZAinner = self._ZAinner(variational_posterior, Z)
|
ZAinner = self._ZAinner(variational_posterior, Z)
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,19 @@
|
||||||
# Copyright (c) 2012, GPy authors (see AUTHORS.txt).
|
# Copyright (c) 2012, GPy authors (see AUTHORS.txt).
|
||||||
# Licensed under the BSD 3-clause license (see LICENSE.txt)
|
# Licensed under the BSD 3-clause license (see LICENSE.txt)
|
||||||
|
|
||||||
|
from ....core.parameterization.parameter_core import Pickleable
|
||||||
|
|
||||||
|
class PSICOMP(Pickleable):
|
||||||
|
|
||||||
|
def psicomputations(self, variance, Z, variational_posterior):
|
||||||
|
"""
|
||||||
|
Compute psi-statistics
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def psiDerivativecomputations(self, dL_dpsi0, dL_dpsi1, dL_dpsi2, variance, Z, variational_posterior):
|
||||||
|
"""
|
||||||
|
Compute the derivatives of parameters by combing dL_dpsi and dpsi_dparam
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,12 @@ The package for the Psi statistics computation of the linear kernel for SSGPLVM
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
from . import PSICOMP
|
||||||
from GPy.util.caching import Cache_this
|
from GPy.util.caching import Cache_this
|
||||||
|
|
||||||
class PSICOMP_SSLinear(object):
|
class PSICOMP_SSLinear(PSICOMP):
|
||||||
#@Cache_this(limit=1, ignore_args=(0,))
|
@Cache_this(limit=1, ignore_args=(0,))
|
||||||
def psicomputations(self, variance, Z, mu, S, gamma):
|
def psicomputations(self, variance, Z, variational_posterior):
|
||||||
"""
|
"""
|
||||||
Compute psi-statistics for ss-linear kernel
|
Compute psi-statistics for ss-linear kernel
|
||||||
"""
|
"""
|
||||||
|
|
@ -19,6 +20,9 @@ class PSICOMP_SSLinear(object):
|
||||||
# psi0 N
|
# psi0 N
|
||||||
# psi1 NxM
|
# psi1 NxM
|
||||||
# psi2 MxM
|
# psi2 MxM
|
||||||
|
mu = variational_posterior.mean
|
||||||
|
S = variational_posterior.variance
|
||||||
|
gamma = variational_posterior.binary_prob
|
||||||
|
|
||||||
psi0 = np.einsum('q,nq,nq->n',variance,gamma,np.square(mu)+S)
|
psi0 = np.einsum('q,nq,nq->n',variance,gamma,np.square(mu)+S)
|
||||||
psi1 = np.einsum('nq,q,mq,nq->nm',gamma,variance,Z,mu)
|
psi1 = np.einsum('nq,q,mq,nq->nm',gamma,variance,Z,mu)
|
||||||
|
|
@ -30,7 +34,7 @@ class PSICOMP_SSLinear(object):
|
||||||
|
|
||||||
return psi0, psi1, psi2
|
return psi0, psi1, psi2
|
||||||
|
|
||||||
#@Cache_this(limit=1, ignore_args=(0,1,2,3))
|
@Cache_this(limit=1, ignore_args=(0,1,2,3))
|
||||||
def psiDerivativecomputations(self, dL_dpsi0, dL_dpsi1, dL_dpsi2, variance, Z, variational_posterior):
|
def psiDerivativecomputations(self, dL_dpsi0, dL_dpsi1, dL_dpsi2, variance, Z, variational_posterior):
|
||||||
mu = variational_posterior.mean
|
mu = variational_posterior.mean
|
||||||
S = variational_posterior.variance
|
S = variational_posterior.variance
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,13 @@ The package for the psi statistics computation
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
from . import PSICOMP
|
||||||
from GPy.util.caching import Cache_this,Cacher
|
from GPy.util.caching import Cache_this,Cacher
|
||||||
|
|
||||||
@Cache_this(limit=1)
|
class PSICOMP_SSRBF(PSICOMP):
|
||||||
def psicomputations(variance, lengthscale, Z, mu, S, gamma):
|
|
||||||
|
@Cache_this(limit=1, ignore_args=(0,))
|
||||||
|
def psicomputations(self, variance, lengthscale, Z, variational_posterior):
|
||||||
"""
|
"""
|
||||||
Z - MxQ
|
Z - MxQ
|
||||||
mu - NxQ
|
mu - NxQ
|
||||||
|
|
@ -19,14 +22,17 @@ def psicomputations(variance, lengthscale, Z, mu, S, gamma):
|
||||||
# here are the "statistics" for psi0, psi1 and psi2
|
# here are the "statistics" for psi0, psi1 and psi2
|
||||||
# Produced intermediate results:
|
# Produced intermediate results:
|
||||||
# _psi1 NxM
|
# _psi1 NxM
|
||||||
|
mu = variational_posterior.mean
|
||||||
|
S = variational_posterior.variance
|
||||||
|
gamma = variational_posterior.binary_prob
|
||||||
|
|
||||||
psi0 = np.empty(mu.shape[0])
|
psi0 = np.empty(mu.shape[0])
|
||||||
psi0[:] = variance
|
psi0[:] = variance
|
||||||
psi1 = _psi1computations(variance, lengthscale, Z, mu, S, gamma)
|
psi1 = self._psi1computations(variance, lengthscale, Z, mu, S, gamma)
|
||||||
psi2 = _psi2computations(variance, lengthscale, Z, mu, S, gamma)
|
psi2 = self._psi2computations(variance, lengthscale, Z, mu, S, gamma)
|
||||||
return psi0, psi1, psi2
|
return psi0, psi1, psi2
|
||||||
|
|
||||||
def _psi1computations(variance, lengthscale, Z, mu, S, gamma):
|
def _psi1computations(self, variance, lengthscale, Z, mu, S, gamma):
|
||||||
"""
|
"""
|
||||||
Z - MxQ
|
Z - MxQ
|
||||||
mu - NxQ
|
mu - NxQ
|
||||||
|
|
@ -37,7 +43,6 @@ def _psi1computations(variance, lengthscale, Z, mu, S, gamma):
|
||||||
# Produced intermediate results:
|
# Produced intermediate results:
|
||||||
# _psi1 NxM
|
# _psi1 NxM
|
||||||
|
|
||||||
|
|
||||||
lengthscale2 = np.square(lengthscale)
|
lengthscale2 = np.square(lengthscale)
|
||||||
|
|
||||||
# psi1
|
# psi1
|
||||||
|
|
@ -55,7 +60,7 @@ def _psi1computations(variance, lengthscale, Z, mu, S, gamma):
|
||||||
|
|
||||||
return _psi1
|
return _psi1
|
||||||
|
|
||||||
def _psi2computations(variance, lengthscale, Z, mu, S, gamma):
|
def _psi2computations(self, variance, lengthscale, Z, mu, S, gamma):
|
||||||
"""
|
"""
|
||||||
Z - MxQ
|
Z - MxQ
|
||||||
mu - NxQ
|
mu - NxQ
|
||||||
|
|
@ -88,11 +93,12 @@ def _psi2computations(variance, lengthscale, Z, mu, S, gamma):
|
||||||
|
|
||||||
return _psi2
|
return _psi2
|
||||||
|
|
||||||
def _psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, variance, lengthscale, Z, variational_posterior):
|
@Cache_this(limit=1, ignore_args=(0,1,2,3))
|
||||||
|
def psiDerivativecomputations(self, dL_dpsi0, dL_dpsi1, dL_dpsi2, variance, lengthscale, Z, variational_posterior):
|
||||||
ARD = (len(lengthscale)!=1)
|
ARD = (len(lengthscale)!=1)
|
||||||
|
|
||||||
dvar_psi1, dl_psi1, dZ_psi1, dmu_psi1, dS_psi1, dgamma_psi1 = _psi1compDer(dL_dpsi1, variance, lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
dvar_psi1, dl_psi1, dZ_psi1, dmu_psi1, dS_psi1, dgamma_psi1 = self._psi1compDer(dL_dpsi1, variance, lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
||||||
dvar_psi2, dl_psi2, dZ_psi2, dmu_psi2, dS_psi2, dgamma_psi2 = _psi2compDer(dL_dpsi2, variance, lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
dvar_psi2, dl_psi2, dZ_psi2, dmu_psi2, dS_psi2, dgamma_psi2 = self._psi2compDer(dL_dpsi2, variance, lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
||||||
|
|
||||||
dL_dvar = np.sum(dL_dpsi0) + dvar_psi1 + dvar_psi2
|
dL_dvar = np.sum(dL_dpsi0) + dvar_psi1 + dvar_psi2
|
||||||
|
|
||||||
|
|
@ -107,7 +113,7 @@ def _psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, variance, lengthsca
|
||||||
|
|
||||||
return dL_dvar, dL_dlengscale, dL_dZ, dL_dmu, dL_dS, dL_dgamma
|
return dL_dvar, dL_dlengscale, dL_dZ, dL_dmu, dL_dS, dL_dgamma
|
||||||
|
|
||||||
def _psi1compDer(dL_dpsi1, variance, lengthscale, Z, mu, S, gamma):
|
def _psi1compDer(self, dL_dpsi1, variance, lengthscale, Z, mu, S, gamma):
|
||||||
"""
|
"""
|
||||||
dL_dpsi1 - NxM
|
dL_dpsi1 - NxM
|
||||||
Z - MxQ
|
Z - MxQ
|
||||||
|
|
@ -148,14 +154,9 @@ def _psi1compDer(dL_dpsi1, variance, lengthscale, Z, mu, S, gamma):
|
||||||
_dL_dZ = np.einsum('nm,nmq,nmq->mq',dL_dpsi1,_psi1_q, (- _psi1_common[:,None,:] * _psi1_dist * _psi1_exp_dist_sq - (1-gamma[:,None,:])/lengthscale2*Z[None,:,:]*_psi1_exp_Z))
|
_dL_dZ = np.einsum('nm,nmq,nmq->mq',dL_dpsi1,_psi1_q, (- _psi1_common[:,None,:] * _psi1_dist * _psi1_exp_dist_sq - (1-gamma[:,None,:])/lengthscale2*Z[None,:,:]*_psi1_exp_Z))
|
||||||
_dL_dlengthscale = lengthscale* np.einsum('nm,nmq,nmq->q',dL_dpsi1,_psi1_q,(_psi1_common[:,None,:]*(S[:,None,:]/lengthscale2+_psi1_dist_sq)*_psi1_exp_dist_sq + (1-gamma[:,None,:])*np.square(Z[None,:,:]/lengthscale2)*_psi1_exp_Z))
|
_dL_dlengthscale = lengthscale* np.einsum('nm,nmq,nmq->q',dL_dpsi1,_psi1_q,(_psi1_common[:,None,:]*(S[:,None,:]/lengthscale2+_psi1_dist_sq)*_psi1_exp_dist_sq + (1-gamma[:,None,:])*np.square(Z[None,:,:]/lengthscale2)*_psi1_exp_Z))
|
||||||
|
|
||||||
# _dpsi1_dmu = _psi1_q * (_psi1_exp_dist_sq * _psi1_dist * _psi1_common) # NxMxQ
|
|
||||||
# _dpsi1_dS = _psi1_q * (_psi1_exp_dist_sq * _psi1_common * 0.5 * (_psi1_dist_sq - 1.)) # NxMxQ
|
|
||||||
# _dpsi1_dZ = _psi1_q * (- _psi1_common * _psi1_dist * _psi1_exp_dist_sq - (1-gamma[:,None,:])/lengthscale2*Z[None,:,:]*_psi1_exp_Z) # NxMxQ
|
|
||||||
# _dpsi1_dlengthscale = 2.*lengthscale*_psi1_q * (0.5*_psi1_common*(S[:,None,:]/lengthscale2+_psi1_dist_sq)*_psi1_exp_dist_sq + 0.5*(1-gamma[:,None,:])*np.square(Z[None,:,:]/lengthscale2)*_psi1_exp_Z) # NxMxQ
|
|
||||||
|
|
||||||
return _dL_dvariance, _dL_dlengthscale, _dL_dZ, _dL_dmu, _dL_dS, _dL_dgamma
|
return _dL_dvariance, _dL_dlengthscale, _dL_dZ, _dL_dmu, _dL_dS, _dL_dgamma
|
||||||
|
|
||||||
def _psi2compDer(dL_dpsi2, variance, lengthscale, Z, mu, S, gamma):
|
def _psi2compDer(self, dL_dpsi2, variance, lengthscale, Z, mu, S, gamma):
|
||||||
"""
|
"""
|
||||||
Z - MxQ
|
Z - MxQ
|
||||||
mu - NxQ
|
mu - NxQ
|
||||||
|
|
@ -199,17 +200,6 @@ def _psi2compDer(dL_dpsi2, variance, lengthscale, Z, mu, S, gamma):
|
||||||
_dL_dmu = -2.*np.einsum('mo,nmoq,nq,nmoq,nmoq->nq',dL_dpsi2,_psi2_q,_psi2_common,_psi2_mudist,_psi2_exp_dist_sq)
|
_dL_dmu = -2.*np.einsum('mo,nmoq,nq,nmoq,nmoq->nq',dL_dpsi2,_psi2_q,_psi2_common,_psi2_mudist,_psi2_exp_dist_sq)
|
||||||
_dL_dS = np.einsum('mo,nmoq,nq,nmoq,nmoq->nq',dL_dpsi2,_psi2_q, _psi2_common, (2.*_psi2_mudist_sq-1.), _psi2_exp_dist_sq)
|
_dL_dS = np.einsum('mo,nmoq,nq,nmoq,nmoq->nq',dL_dpsi2,_psi2_q, _psi2_common, (2.*_psi2_mudist_sq-1.), _psi2_exp_dist_sq)
|
||||||
_dL_dZ = 2.*np.einsum('mo,nmoq,nmoq->mq',dL_dpsi2,_psi2_q,(_psi2_common[:,None,None,:]*(-_psi2_Zdist*_psi2_denom[:,None,None,:]+_psi2_mudist)*_psi2_exp_dist_sq - (1-gamma[:,None,None,:])*Z[:,None,:]/lengthscale2*_psi2_exp_Z))
|
_dL_dZ = 2.*np.einsum('mo,nmoq,nmoq->mq',dL_dpsi2,_psi2_q,(_psi2_common[:,None,None,:]*(-_psi2_Zdist*_psi2_denom[:,None,None,:]+_psi2_mudist)*_psi2_exp_dist_sq - (1-gamma[:,None,None,:])*Z[:,None,:]/lengthscale2*_psi2_exp_Z))
|
||||||
# print _psi2_common[:,None,None,:]*(S[:,None,None,:]/lengthscale2+_psi2_Zdist_sq*_psi2_denom[:,None,None,:]+_psi2_mudist_sq)*_psi2_exp_dist_sq #+(1-gamma[:,None,None,:])*_psi2_Z_sq_sum*0.5/lengthscale2*_psi2_exp_Z)
|
|
||||||
_dL_dlengthscale = 2.*lengthscale* np.einsum('mo,nmoq,nmoq->q',dL_dpsi2,_psi2_q,(_psi2_common[:,None,None,:]*(S[:,None,None,:]/lengthscale2+_psi2_Zdist_sq*_psi2_denom[:,None,None,:]+_psi2_mudist_sq)*_psi2_exp_dist_sq+(1-gamma[:,None,None,:])*_psi2_Z_sq_sum*0.5/lengthscale2*_psi2_exp_Z))
|
_dL_dlengthscale = 2.*lengthscale* np.einsum('mo,nmoq,nmoq->q',dL_dpsi2,_psi2_q,(_psi2_common[:,None,None,:]*(S[:,None,None,:]/lengthscale2+_psi2_Zdist_sq*_psi2_denom[:,None,None,:]+_psi2_mudist_sq)*_psi2_exp_dist_sq+(1-gamma[:,None,None,:])*_psi2_Z_sq_sum*0.5/lengthscale2*_psi2_exp_Z))
|
||||||
|
|
||||||
|
|
||||||
# _dpsi2_dvariance = 2. * _psi2/variance # NxMxM
|
|
||||||
# _dpsi2_dgamma = _psi2_q * (_psi2_exp_dist_sq/_psi2_denom_sqrt - _psi2_exp_Z) # NxMxMxQ
|
|
||||||
# _dpsi2_dmu = _psi2_q * (-2.*_psi2_common*_psi2_mudist * _psi2_exp_dist_sq) # NxMxMxQ
|
|
||||||
# _dpsi2_dS = _psi2_q * (_psi2_common * (2.*_psi2_mudist_sq - 1.) * _psi2_exp_dist_sq) # NxMxMxQ
|
|
||||||
# _dpsi2_dZ = 2.*_psi2_q * (_psi2_common*(-_psi2_Zdist*_psi2_denom+_psi2_mudist)*_psi2_exp_dist_sq - (1-gamma[:,None,None,:])*Z[:,None,:]/lengthscale2*_psi2_exp_Z) # NxMxMxQ
|
|
||||||
# _dpsi2_dlengthscale = 2.*lengthscale* _psi2_q * (_psi2_common*(S[:,None,None,:]/lengthscale2+_psi2_Zdist_sq*_psi2_denom+_psi2_mudist_sq)*_psi2_exp_dist_sq+(1-gamma[:,None,None,:])*_psi2_Z_sq_sum*0.5/lengthscale2*_psi2_exp_Z) # NxMxMxQ
|
|
||||||
|
|
||||||
return _dL_dvariance, _dL_dlengthscale, _dL_dZ, _dL_dmu, _dL_dS, _dL_dgamma
|
return _dL_dvariance, _dL_dlengthscale, _dL_dZ, _dL_dmu, _dL_dS, _dL_dgamma
|
||||||
|
|
||||||
psiDerivativecomputations = Cacher(_psiDerivativecomputations, limit=1, ignore_args=(0,1,2,))
|
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ class RBF(Stationary):
|
||||||
if self.useGPU:
|
if self.useGPU:
|
||||||
self.psicomp = ssrbf_psi_gpucomp.PSICOMP_SSRBF()
|
self.psicomp = ssrbf_psi_gpucomp.PSICOMP_SSRBF()
|
||||||
else:
|
else:
|
||||||
self.psicomp = ssrbf_psi_comp
|
self.psicomp = ssrbf_psi_comp.PSICOMP_SSRBF()
|
||||||
|
|
||||||
def K_of_r(self, r):
|
def K_of_r(self, r):
|
||||||
return self.variance * np.exp(-0.5 * r**2)
|
return self.variance * np.exp(-0.5 * r**2)
|
||||||
|
|
@ -48,7 +48,7 @@ class RBF(Stationary):
|
||||||
if self.useGPU:
|
if self.useGPU:
|
||||||
return self.psicomp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[0]
|
return self.psicomp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[0]
|
||||||
else:
|
else:
|
||||||
return ssrbf_psi_comp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[0]
|
return self.psicomp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior)[0]
|
||||||
else:
|
else:
|
||||||
return self.Kdiag(variational_posterior.mean)
|
return self.Kdiag(variational_posterior.mean)
|
||||||
|
|
||||||
|
|
@ -57,7 +57,7 @@ class RBF(Stationary):
|
||||||
if self.useGPU:
|
if self.useGPU:
|
||||||
return self.psicomp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[1]
|
return self.psicomp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[1]
|
||||||
else:
|
else:
|
||||||
return ssrbf_psi_comp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[1]
|
return self.psicomp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior)[1]
|
||||||
else:
|
else:
|
||||||
_, _, _, psi1 = self._psi1computations(Z, variational_posterior)
|
_, _, _, psi1 = self._psi1computations(Z, variational_posterior)
|
||||||
return psi1
|
return psi1
|
||||||
|
|
@ -67,7 +67,7 @@ class RBF(Stationary):
|
||||||
if self.useGPU:
|
if self.useGPU:
|
||||||
return self.psicomp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[2]
|
return self.psicomp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[2]
|
||||||
else:
|
else:
|
||||||
return ssrbf_psi_comp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)[2]
|
return self.psicomp.psicomputations(self.variance, self.lengthscale, Z, variational_posterior)[2]
|
||||||
else:
|
else:
|
||||||
_, _, _, _, psi2 = self._psi2computations(Z, variational_posterior)
|
_, _, _, _, psi2 = self._psi2computations(Z, variational_posterior)
|
||||||
return psi2
|
return psi2
|
||||||
|
|
@ -78,31 +78,10 @@ class RBF(Stationary):
|
||||||
if self.useGPU:
|
if self.useGPU:
|
||||||
self.psicomp.update_gradients_expectations(dL_dpsi0, dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
self.psicomp.update_gradients_expectations(dL_dpsi0, dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
||||||
else:
|
else:
|
||||||
# dL_dvar, dL_dlengscale, dL_dZ, dL_dgamma, dL_dmu, dL_dS = ssrbf_psi_comp.psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
dL_dvar, dL_dlengscale, _, _, _, _ = self.psicomp.psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
||||||
dL_dvar, dL_dlengscale, _, _, _, _ = ssrbf_psi_comp.psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
|
||||||
self.variance.gradient = dL_dvar
|
self.variance.gradient = dL_dvar
|
||||||
self.lengthscale.gradient = dL_dlengscale
|
self.lengthscale.gradient = dL_dlengscale
|
||||||
|
|
||||||
# _, _dpsi1_dvariance, _, _, _, _, _dpsi1_dlengthscale = ssrbf_psi_comp._psi1computations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
|
||||||
# _, _dpsi2_dvariance, _, _, _, _, _dpsi2_dlengthscale = ssrbf_psi_comp._psi2computations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
|
||||||
#
|
|
||||||
# #contributions from psi0:
|
|
||||||
# self.variance.gradient = np.sum(dL_dpsi0)
|
|
||||||
#
|
|
||||||
# #from psi1
|
|
||||||
# self.variance.gradient += np.sum(dL_dpsi1 * _dpsi1_dvariance)
|
|
||||||
# if self.ARD:
|
|
||||||
# self.lengthscale.gradient = (dL_dpsi1[:,:,None]*_dpsi1_dlengthscale).reshape(-1,self.input_dim).sum(axis=0)
|
|
||||||
# else:
|
|
||||||
# self.lengthscale.gradient = (dL_dpsi1[:,:,None]*_dpsi1_dlengthscale).sum()
|
|
||||||
#
|
|
||||||
# #from psi2
|
|
||||||
# self.variance.gradient += (dL_dpsi2 * _dpsi2_dvariance).sum()
|
|
||||||
# if self.ARD:
|
|
||||||
# self.lengthscale.gradient += (dL_dpsi2[:,:,:,None] * _dpsi2_dlengthscale).reshape(-1,self.input_dim).sum(axis=0)
|
|
||||||
# else:
|
|
||||||
# self.lengthscale.gradient += (dL_dpsi2[:,:,:,None] * _dpsi2_dlengthscale).sum()
|
|
||||||
|
|
||||||
elif isinstance(variational_posterior, variational.NormalPosterior):
|
elif isinstance(variational_posterior, variational.NormalPosterior):
|
||||||
l2 = self.lengthscale**2
|
l2 = self.lengthscale**2
|
||||||
if l2.size != self.input_dim:
|
if l2.size != self.input_dim:
|
||||||
|
|
@ -140,20 +119,9 @@ class RBF(Stationary):
|
||||||
if self.useGPU:
|
if self.useGPU:
|
||||||
return self.psicomp.gradients_Z_expectations(dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
return self.psicomp.gradients_Z_expectations(dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
||||||
else:
|
else:
|
||||||
_, _, dL_dZ, _, _, _ = ssrbf_psi_comp.psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
_, _, dL_dZ, _, _, _ = self.psicomp.psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
||||||
return dL_dZ
|
return dL_dZ
|
||||||
|
|
||||||
# _, _, _, _, _, _dpsi1_dZ, _ = ssrbf_psi_comp._psi1computations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
|
||||||
# _, _, _, _, _, _dpsi2_dZ, _ = ssrbf_psi_comp._psi2computations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
|
||||||
#
|
|
||||||
# #psi1
|
|
||||||
# grad = (dL_dpsi1[:, :, None] * _dpsi1_dZ).sum(axis=0)
|
|
||||||
#
|
|
||||||
# #psi2
|
|
||||||
# grad += (dL_dpsi2[:, :, :, None] * _dpsi2_dZ).sum(axis=0).sum(axis=1)
|
|
||||||
#
|
|
||||||
# return grad
|
|
||||||
|
|
||||||
elif isinstance(variational_posterior, variational.NormalPosterior):
|
elif isinstance(variational_posterior, variational.NormalPosterior):
|
||||||
l2 = self.lengthscale **2
|
l2 = self.lengthscale **2
|
||||||
|
|
||||||
|
|
@ -179,29 +147,9 @@ class RBF(Stationary):
|
||||||
if self.useGPU:
|
if self.useGPU:
|
||||||
return self.psicomp.gradients_qX_expectations(dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
return self.psicomp.gradients_qX_expectations(dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
||||||
else:
|
else:
|
||||||
_, _, _, dL_dmu, dL_dS, dL_dgamma = ssrbf_psi_comp.psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
_, _, _, dL_dmu, dL_dS, dL_dgamma = self.psicomp.psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, self.variance, self.lengthscale, Z, variational_posterior)
|
||||||
return dL_dmu, dL_dS, dL_dgamma
|
return dL_dmu, dL_dS, dL_dgamma
|
||||||
|
|
||||||
# ndata = variational_posterior.mean.shape[0]
|
|
||||||
#
|
|
||||||
# _, _, _dpsi1_dgamma, _dpsi1_dmu, _dpsi1_dS, _, _ = ssrbf_psi_comp._psi1computations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
|
||||||
# _, _, _dpsi2_dgamma, _dpsi2_dmu, _dpsi2_dS, _, _ = ssrbf_psi_comp._psi2computations(self.variance, self.lengthscale, Z, variational_posterior.mean, variational_posterior.variance, variational_posterior.binary_prob)
|
|
||||||
#
|
|
||||||
# #psi1
|
|
||||||
# grad_mu = (dL_dpsi1[:, :, None] * _dpsi1_dmu).sum(axis=1)
|
|
||||||
# grad_S = (dL_dpsi1[:, :, None] * _dpsi1_dS).sum(axis=1)
|
|
||||||
# grad_gamma = (dL_dpsi1[:,:,None] * _dpsi1_dgamma).sum(axis=1)
|
|
||||||
#
|
|
||||||
# #psi2
|
|
||||||
# grad_mu += (dL_dpsi2[:, :, :, None] * _dpsi2_dmu).reshape(ndata,-1,self.input_dim).sum(axis=1)
|
|
||||||
# grad_S += (dL_dpsi2[:, :, :, None] * _dpsi2_dS).reshape(ndata,-1,self.input_dim).sum(axis=1)
|
|
||||||
# grad_gamma += (dL_dpsi2[:,:,:, None] * _dpsi2_dgamma).reshape(ndata,-1,self.input_dim).sum(axis=1)
|
|
||||||
#
|
|
||||||
# if self.group_spike_prob:
|
|
||||||
# grad_gamma[:] = grad_gamma.mean(axis=0)
|
|
||||||
#
|
|
||||||
# return grad_mu, grad_S, grad_gamma
|
|
||||||
|
|
||||||
elif isinstance(variational_posterior, variational.NormalPosterior):
|
elif isinstance(variational_posterior, variational.NormalPosterior):
|
||||||
|
|
||||||
l2 = self.lengthscale **2
|
l2 = self.lengthscale **2
|
||||||
|
|
|
||||||
|
|
@ -59,14 +59,6 @@ class SSGPLVM(SparseGP):
|
||||||
pi = np.empty((input_dim))
|
pi = np.empty((input_dim))
|
||||||
pi[:] = 0.5
|
pi[:] = 0.5
|
||||||
|
|
||||||
# if mpi_comm != None:
|
|
||||||
# mpi_comm.Bcast(X, root=0)
|
|
||||||
# mpi_comm.Bcast(fracs, root=0)
|
|
||||||
# mpi_comm.Bcast(X_variance, root=0)
|
|
||||||
# mpi_comm.Bcast(gamma, root=0)
|
|
||||||
# mpi_comm.Bcast(Z, root=0)
|
|
||||||
# mpi_comm.Bcast(pi, root=0)
|
|
||||||
|
|
||||||
if likelihood is None:
|
if likelihood is None:
|
||||||
likelihood = Gaussian()
|
likelihood = Gaussian()
|
||||||
|
|
||||||
|
|
@ -74,6 +66,9 @@ class SSGPLVM(SparseGP):
|
||||||
kernel = kern.RBF(input_dim, lengthscale=fracs, ARD=True) # + kern.white(input_dim)
|
kernel = kern.RBF(input_dim, lengthscale=fracs, ARD=True) # + kern.white(input_dim)
|
||||||
kernel.set_for_SpikeAndSlab()
|
kernel.set_for_SpikeAndSlab()
|
||||||
|
|
||||||
|
if inference_method is None:
|
||||||
|
inference_method = VarDTC_minibatch(mpi_comm=mpi_comm)
|
||||||
|
|
||||||
self.variational_prior = SpikeAndSlabPrior(pi=pi) # the prior probability of the latent binary variable b
|
self.variational_prior = SpikeAndSlabPrior(pi=pi) # the prior probability of the latent binary variable b
|
||||||
|
|
||||||
X = SpikeAndSlabPosterior(X, X_variance, gamma)
|
X = SpikeAndSlabPosterior(X, X_variance, gamma)
|
||||||
|
|
@ -131,16 +126,14 @@ class SSGPLVM(SparseGP):
|
||||||
|
|
||||||
def __getstate__(self):
|
def __getstate__(self):
|
||||||
dc = super(SSGPLVM, self).__getstate__()
|
dc = super(SSGPLVM, self).__getstate__()
|
||||||
del dc['mpi_comm']
|
dc['mpi_comm'] = None
|
||||||
|
if self.mpi_comm != None:
|
||||||
del dc['Y_local']
|
del dc['Y_local']
|
||||||
del dc['X_local']
|
del dc['X_local']
|
||||||
|
del dc['Y_range']
|
||||||
return dc
|
return dc
|
||||||
|
|
||||||
def __setstate__(self, state):
|
def __setstate__(self, state):
|
||||||
state['mpi_comm'] = None
|
|
||||||
Y_range = state['Y_range']
|
|
||||||
state['Y_local'] = state['Y'][Y_range[0]:Y_range[1]]
|
|
||||||
state['X_local'] = state['X'][Y_range[0]:Y_range[1]]
|
|
||||||
return super(SSGPLVM, self).__setstate__(state)
|
return super(SSGPLVM, self).__setstate__(state)
|
||||||
|
|
||||||
def _grads(self, x):
|
def _grads(self, x):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue