From 3d322301a2659a43e87c22a333d9f6f320ab939a Mon Sep 17 00:00:00 2001 From: Zhenwen Dai Date: Mon, 18 Aug 2014 16:44:15 +0100 Subject: [PATCH] linear kernel psi statistics performance optimization --- GPy/kern/_src/psi_comp/linear_psi_comp.py | 11 ++++------- GPy/kern/_src/psi_comp/sslinear_psi_comp.py | 18 +++++++----------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/GPy/kern/_src/psi_comp/linear_psi_comp.py b/GPy/kern/_src/psi_comp/linear_psi_comp.py index 4f064a59..94cba0f5 100644 --- a/GPy/kern/_src/psi_comp/linear_psi_comp.py +++ b/GPy/kern/_src/psi_comp/linear_psi_comp.py @@ -21,9 +21,7 @@ def psicomputations(variance, Z, variational_posterior): psi0 = np.einsum('q,nq->n',variance,np.square(mu)+S) psi1 = np.einsum('q,mq,nq->nm',variance,Z,mu) - - tmp = np.einsum('q,mq,nq->nm',variance,Z,mu) - psi2 = np.einsum('q,mq,oq,nq->mo',np.square(variance),Z,Z,S) + np.einsum('nm,no->mo',tmp,tmp) + psi2 = np.einsum('q,mq,oq,nq->mo',np.square(variance),Z,Z,S) + np.einsum('nm,no->mo',psi1,psi1) return psi0, psi1, psi2 @@ -58,13 +56,12 @@ def _psi2computations(dL_dpsi2, variance, Z, mu, S): variance2 = np.square(variance) common_sum = np.einsum('q,mq,nq->nm',variance,Z,mu) # NxM + dL_dpsi2_2 = dL_dpsi2+dL_dpsi2.T dL_dvar = np.einsum('mo,nq,q,mq,oq->q',dL_dpsi2,2.*S,variance,Z,Z)+\ - np.einsum('mo,mq,nq,no->q',dL_dpsi2,Z,mu,common_sum)+\ - np.einsum('mo,oq,nq,nm->q',dL_dpsi2,Z,mu,common_sum) + np.einsum('mo,mq,nq,no->q',dL_dpsi2_2,Z,mu,common_sum) - dL_dmu = np.einsum('mo,q,mq,no->nq',dL_dpsi2,variance,Z,common_sum)+\ - np.einsum('mo,q,oq,nm->nq',dL_dpsi2,variance,Z,common_sum) + dL_dmu = np.einsum('mo,q,mq,no->nq',dL_dpsi2_2,variance,Z,common_sum) dL_dS = np.empty(S.shape) dL_dS[:] = np.einsum('mo,q,mq,oq->q',dL_dpsi2,variance2,Z,Z) diff --git a/GPy/kern/_src/psi_comp/sslinear_psi_comp.py b/GPy/kern/_src/psi_comp/sslinear_psi_comp.py index ec81c40f..dc864b3c 100644 --- a/GPy/kern/_src/psi_comp/sslinear_psi_comp.py +++ b/GPy/kern/_src/psi_comp/sslinear_psi_comp.py @@ -22,11 +22,8 @@ def psicomputations(variance, Z, variational_posterior): 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) - mu2 = np.square(mu) - variances2 = np.square(variance) - tmp = np.einsum('nq,q,mq,nq->nm',gamma,variance,Z,mu) - psi2 = np.einsum('nq,q,mq,oq,nq->mo',gamma,variances2,Z,Z,mu2+S)+\ - np.einsum('nm,no->mo',tmp,tmp) - np.einsum('nq,q,mq,oq,nq->mo',np.square(gamma),variances2,Z,Z,mu2) + psi2 = np.einsum('nq,q,mq,oq,nq->mo',gamma,np.square(variance),Z,Z,(1-gamma)*np.square(mu)+S) +\ + np.einsum('nm,no->mo',psi1,psi1) return psi0, psi1, psi2 @@ -67,18 +64,17 @@ def _psi2computations(dL_dpsi2, variance, Z, mu, S, gamma): variance2 = np.square(variance) mu2S = mu2+S # NxQ common_sum = np.einsum('nq,q,mq,nq->nm',gamma,variance,Z,mu) # NxM + + dL_dpsi2_2 = dL_dpsi2+dL_dpsi2.T dL_dvar = np.einsum('mo,nq,q,mq,oq->q',dL_dpsi2,2.*(gamma*mu2S-gamma2*mu2),variance,Z,Z)+\ - np.einsum('mo,nq,mq,nq,no->q',dL_dpsi2,gamma,Z,mu,common_sum)+\ - np.einsum('mo,nq,oq,nq,nm->q',dL_dpsi2,gamma,Z,mu,common_sum) + np.einsum('mo,nq,mq,nq,no->q',dL_dpsi2_2,gamma,Z,mu,common_sum) dL_dgamma = np.einsum('mo,q,mq,oq,nq->nq',dL_dpsi2,variance2,Z,Z,(mu2S-2.*gamma*mu2))+\ - np.einsum('mo,q,mq,nq,no->nq',dL_dpsi2,variance,Z,mu,common_sum)+\ - np.einsum('mo,q,oq,nq,nm->nq',dL_dpsi2,variance,Z,mu,common_sum) + np.einsum('mo,q,mq,nq,no->nq',dL_dpsi2_2,variance,Z,mu,common_sum) dL_dmu = np.einsum('mo,q,mq,oq,nq,nq->nq',dL_dpsi2,variance2,Z,Z,mu,2.*(gamma-gamma2))+\ - np.einsum('mo,nq,q,mq,no->nq',dL_dpsi2,gamma,variance,Z,common_sum)+\ - np.einsum('mo,nq,q,oq,nm->nq',dL_dpsi2,gamma,variance,Z,common_sum) + np.einsum('mo,nq,q,mq,no->nq',dL_dpsi2_2,gamma,variance,Z,common_sum) dL_dS = np.einsum('mo,nq,q,mq,oq->nq',dL_dpsi2,gamma,variance2,Z,Z)