From 7fa0c19a88c102516904ad007164f0276a095309 Mon Sep 17 00:00:00 2001 From: Zhenwen Dai Date: Mon, 30 Mar 2015 22:24:48 +0100 Subject: [PATCH] optimize sslinear kernel --- GPy/kern/_src/psi_comp/sslinear_psi_comp.py | 44 +++++++++------------ 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/GPy/kern/_src/psi_comp/sslinear_psi_comp.py b/GPy/kern/_src/psi_comp/sslinear_psi_comp.py index 5f261785..d431cd61 100644 --- a/GPy/kern/_src/psi_comp/sslinear_psi_comp.py +++ b/GPy/kern/_src/psi_comp/sslinear_psi_comp.py @@ -37,11 +37,11 @@ def psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, variance, Z, variati # Compute for psi0 and psi1 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) - 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_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_dS += np.einsum('n,nq,q->nq',dL_dpsi0,gamma,variance) - dL_dZ += np.einsum('nm,nq,q,nq->mq',dL_dpsi1,gamma, variance,mu) + dL_dvar += (dL_dpsi0[:,None]*gamma*mu2S).sum(axis=0) + (dL_dpsi1.T.dot(gamma*mu)*Z).sum(axis=0) + dL_dgamma += dL_dpsi0[:,None]*variance*mu2S+ dL_dpsi1.dot(Z)*mu*variance + dL_dmu += dL_dpsi0[:,None]*2.*variance*gamma*mu + dL_dpsi1.dot(Z)*gamma*variance + dL_dS += dL_dpsi0[:,None]*variance*gamma + dL_dZ += dL_dpsi1.T.dot(gamma*mu)*variance return dL_dvar, dL_dZ, dL_dmu, dL_dS, dL_dgamma @@ -64,29 +64,23 @@ def _psi2computations(dL_dpsi2, variance, Z, mu, S, gamma): gamma2 = np.square(gamma) variance2 = np.square(variance) mu2S = mu2+S # NxQ - gvm = np.einsum('nq,nq,q->nq',gamma,mu,variance) - common_sum = np.einsum('nq,mq->nm',gvm,Z) -# common_sum = np.einsum('nq,q,mq,nq->nm',gamma,variance,Z,mu) # NxM - Z_expect = np.einsum('mo,mq,oq->q',dL_dpsi2,Z,Z) + gvm = gamma*mu*variance + common_sum = gvm.dot(Z.T) + Z_expect = (np.dot(dL_dpsi2,Z)*Z).sum(axis=0) + Z_expect_var2 = Z_expect*variance2 dL_dpsi2T = dL_dpsi2+dL_dpsi2.T - tmp = np.einsum('mo,oq->mq',dL_dpsi2T,Z) - common_expect = np.einsum('mq,nm->nq',tmp,common_sum) -# common_expect = np.einsum('mo,mq,no->nq',dL_dpsi2+dL_dpsi2.T,Z,common_sum) - Z2_expect = np.einsum('om,nm->no',dL_dpsi2T,common_sum) - Z1_expect = np.einsum('om,mq->oq',dL_dpsi2T,Z) + common_expect = common_sum.dot(dL_dpsi2T).dot(Z) + Z2_expect = common_sum.dot(dL_dpsi2T) + Z1_expect = dL_dpsi2T.dot(Z) - dL_dvar = np.einsum('nq,q,q->q',2.*(gamma*mu2S-gamma2*mu2),variance,Z_expect)+\ - np.einsum('nq,nq,nq->q',common_expect,gamma,mu) + dL_dvar = variance*Z_expect*2.*(gamma*mu2S-gamma2*mu2).sum(axis=0)+(common_expect*gamma*mu).sum(axis=0) - 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_dgamma = Z_expect_var2*(mu2S-2.*gamma*mu2)+common_expect*mu*variance + + dL_dmu = Z_expect_var2*mu*2.*(gamma-gamma2) + common_expect*gamma*variance + + dL_dS = gamma*Z_expect_var2 - dL_dmu = np.einsum('q,q,nq,nq->nq',Z_expect,variance2,mu,2.*(gamma-gamma2))+\ - 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_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_dZ = (gamma*(mu2S-gamma*mu2)).sum(axis=0)*variance2*Z1_expect+ Z2_expect.T.dot(gamma*mu)*variance return dL_dvar, dL_dgamma, dL_dmu, dL_dS, dL_dZ