mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-27 14:25:16 +02:00
great speed improvement for sslinear
This commit is contained in:
parent
ac33a75999
commit
f4f6a306a2
1 changed files with 23 additions and 26 deletions
|
|
@ -21,7 +21,7 @@ def psicomputations(variance, Z, variational_posterior):
|
||||||
mu = variational_posterior.mean
|
mu = variational_posterior.mean
|
||||||
S = variational_posterior.variance
|
S = variational_posterior.variance
|
||||||
gamma = variational_posterior.binary_prob
|
gamma = variational_posterior.binary_prob
|
||||||
|
|
||||||
psi0 = (gamma*(np.square(mu)+S)*variance).sum(axis=-1)
|
psi0 = (gamma*(np.square(mu)+S)*variance).sum(axis=-1)
|
||||||
psi1 = np.inner(variance*gamma*mu,Z)
|
psi1 = np.inner(variance*gamma*mu,Z)
|
||||||
psi2 = np.inner(np.square(variance)*(gamma*((1-gamma)*np.square(mu)+S)).sum(axis=0)*Z,Z)+tdot(psi1.T)
|
psi2 = np.inner(np.square(variance)*(gamma*((1-gamma)*np.square(mu)+S)).sum(axis=0)*Z,Z)+tdot(psi1.T)
|
||||||
|
|
@ -37,11 +37,15 @@ def psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, variance, Z, variati
|
||||||
|
|
||||||
# Compute for psi0 and psi1
|
# Compute for psi0 and psi1
|
||||||
mu2S = np.square(mu)+S
|
mu2S = np.square(mu)+S
|
||||||
dL_dvar += np.einsum('n,nq,nq->q',dL_dpsi0,gamma,mu2S) + np.einsum('nm,nq,mq,nq->q',dL_dpsi1,gamma,Z,mu)
|
mugamma = gamma*mu
|
||||||
dL_dgamma += np.einsum('n,q,nq->nq',dL_dpsi0,variance,mu2S) + np.einsum('nm,q,mq,nq->nq',dL_dpsi1,variance,Z,mu)
|
dL_dpsi0_var = dL_dpsi0[:,None]*variance[None,:]
|
||||||
dL_dmu += np.einsum('n,nq,q,nq->nq',dL_dpsi0,gamma,2.*variance,mu) + np.einsum('nm,nq,q,mq->nq',dL_dpsi1,gamma,variance,Z)
|
dL_dpsi1_mugamma = np.dot(dL_dpsi1.T,mugamma)
|
||||||
dL_dS += np.einsum('n,nq,q->nq',dL_dpsi0,gamma,variance)
|
dL_dvar += (dL_dpsi0[:,None]*gamma*mu2S).sum(axis=0) + (dL_dpsi1_mugamma*Z).sum(axis=0)
|
||||||
dL_dZ += np.einsum('nm,nq,q,nq->mq',dL_dpsi1,gamma, variance,mu)
|
dL_dpsi1_Z = np.dot(dL_dpsi1,Z)
|
||||||
|
dL_dgamma += dL_dpsi0_var*mu2S+ dL_dpsi1_Z*mu*variance
|
||||||
|
dL_dmu += 2.*dL_dpsi0_var*mugamma+dL_dpsi1_Z*gamma*variance
|
||||||
|
dL_dS += dL_dpsi0_var*gamma
|
||||||
|
dL_dZ += dL_dpsi1_mugamma*variance
|
||||||
|
|
||||||
return dL_dvar, dL_dZ, dL_dmu, dL_dS, dL_dgamma
|
return dL_dvar, dL_dZ, dL_dmu, dL_dS, dL_dgamma
|
||||||
|
|
||||||
|
|
@ -64,29 +68,22 @@ def _psi2computations(dL_dpsi2, variance, Z, mu, S, gamma):
|
||||||
gamma2 = np.square(gamma)
|
gamma2 = np.square(gamma)
|
||||||
variance2 = np.square(variance)
|
variance2 = np.square(variance)
|
||||||
mu2S = mu2+S # NxQ
|
mu2S = mu2+S # NxQ
|
||||||
gvm = np.einsum('nq,nq,q->nq',gamma,mu,variance)
|
gvm = gamma*mu*variance
|
||||||
common_sum = np.einsum('nq,mq->nm',gvm,Z)
|
common_sum = np.dot(gvm,Z.T)
|
||||||
# common_sum = np.einsum('nq,q,mq,nq->nm',gamma,variance,Z,mu) # NxM
|
Z_expect = (np.dot(dL_dpsi2,Z)*Z).sum(axis=0)
|
||||||
Z_expect = np.einsum('mo,mq,oq->q',dL_dpsi2,Z,Z)
|
|
||||||
dL_dpsi2T = dL_dpsi2+dL_dpsi2.T
|
dL_dpsi2T = dL_dpsi2+dL_dpsi2.T
|
||||||
tmp = np.einsum('mo,oq->mq',dL_dpsi2T,Z)
|
common_expect = np.dot(common_sum,np.dot(dL_dpsi2T,Z))
|
||||||
common_expect = np.einsum('mq,nm->nq',tmp,common_sum)
|
Z2_expect = np.inner(common_sum,dL_dpsi2T)
|
||||||
# common_expect = np.einsum('mo,mq,no->nq',dL_dpsi2+dL_dpsi2.T,Z,common_sum)
|
Z1_expect = np.dot(dL_dpsi2T,Z)
|
||||||
Z2_expect = np.einsum('om,nm->no',dL_dpsi2T,common_sum)
|
|
||||||
Z1_expect = np.einsum('om,mq->oq',dL_dpsi2T,Z)
|
|
||||||
|
|
||||||
dL_dvar = np.einsum('nq,q,q->q',2.*(gamma*mu2S-gamma2*mu2),variance,Z_expect)+\
|
dL_dvar = 2.*variance*Z_expect*(gamma*mu2S-gamma2*mu2).sum(axis=0)+(common_expect*gamma*mu).sum(axis=0)
|
||||||
np.einsum('nq,nq,nq->q',common_expect,gamma,mu)
|
|
||||||
|
|
||||||
dL_dgamma = np.einsum('q,q,nq->nq',Z_expect,variance2,(mu2S-2.*gamma*mu2))+\
|
|
||||||
np.einsum('nq,q,nq->nq',common_expect,variance,mu)
|
|
||||||
|
|
||||||
dL_dmu = np.einsum('q,q,nq,nq->nq',Z_expect,variance2,mu,2.*(gamma-gamma2))+\
|
dL_dgamma = Z_expect*variance2*(mu2S-2.*gamma*mu2) + variance*mu*common_expect
|
||||||
np.einsum('nq,nq,q->nq',common_expect,gamma,variance)
|
|
||||||
|
|
||||||
dL_dS = np.einsum('q,nq,q->nq',Z_expect,gamma,variance2)
|
|
||||||
|
|
||||||
# dL_dZ = 2.*(np.einsum('om,nq,q,mq,nq->oq',dL_dpsi2,gamma,variance2,Z,(mu2S-gamma*mu2))+np.einsum('om,nq,q,nq,nm->oq',dL_dpsi2,gamma,variance,mu,common_sum))
|
dL_dmu = 2.*Z_expect*variance2*mu*(gamma-gamma2)+variance*common_expect*gamma
|
||||||
dL_dZ = Z1_expect*np.einsum('nq,q,nq->q',gamma,variance2,(mu2S-gamma*mu2))+np.einsum('nq,q,nq,nm->mq',gamma,variance,mu,Z2_expect)
|
|
||||||
|
dL_dS = gamma*variance2*Z_expect
|
||||||
|
|
||||||
|
dL_dZ = (gamma*(mu2S-gamma*mu2)).sum(axis=0)*variance2*Z1_expect+ np.dot(Z2_expect.T,(gamma*mu))*variance
|
||||||
|
|
||||||
return dL_dvar, dL_dgamma, dL_dmu, dL_dS, dL_dZ
|
return dL_dvar, dL_dgamma, dL_dmu, dL_dS, dL_dZ
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue