In [ ]:
import MVG as MVG
import SuperMatExpr as SME
from sympy import *
import utils as utils

def getDet(cov):
     return -cov.shape[0]/2*ln(2*pi) - Rational(1,2)*ln(Determinant(cov))

D, N, Ns = symbols('D N Ns')
sig_y = symbols('\u03c3_y')

w = SME.SuperMatSymbol('w',D,1,'var')
y = SME.SuperMatSymbol('y',N,1,'var')
ys = SME.SuperMatSymbol('y_s',Ns,1,'var')
X = SME.SuperMatSymbol('X',D,N,'var')
Xs = SME.SuperMatSymbol('X_s',D,Ns,'var')

mu_w = SME.SuperMatSymbol('',D,1,'mean',dependent_vars=[w],expanded=ZeroMatrix(D,1))
mu_y = SME.SuperMatSymbol('',N,1,'mean',dependent_vars=[y],cond_vars=[w,X],expanded=X.T*w)
mu_ys = SME.SuperMatSymbol('',Ns,1,'mean',dependent_vars=[ys],cond_vars=[w,Xs],expanded=Xs.T*w)
S_ww = SME.SuperMatSymbol('',D,D,'covar',dependent_vars=[w],expanded=Identity(D))
S_yy = SME.SuperMatSymbol('',N,N,'covar',dependent_vars=[y],cond_vars=[w,X],expanded=sig_y**2*Identity(N))
S_ysys = SME.SuperMatSymbol('',Ns,Ns,'covar',dependent_vars=[ys],cond_vars=[w,Xs],expanded=sig_y**2*Identity(Ns))

p_w = MVG.MVG([w],moments=[mu_w,S_ww,getDet(S_ww)])
p_y = MVG.MVG([y],moments=[mu_y,S_yy,getDet(S_yy)],conditioned_vars=[w,X])
p_ys = MVG.MVG([ys],moments=[mu_ys,S_ysys,getDet(S_ysys)],conditioned_vars=[w,Xs])
p_w_y = p_w*p_y
p_w_post = p_w_y.condition([y])
p_w_ys = p_w_post*p_ys
p_ys_post = p_w_ys.marginalize([w])
print(utils.matLatex(p_ys_post.covar.expanded))

$I + -1 X \left(\sigma_y^{2} I + X^T X\right)^{-1} X^T$

$Xs^T X \left(\sigma_y^{2} I + X^T X\right)^{-1} y$


In [ ]: