Hello.
I am running some Gaussian processes models. When computing the posterior mean I am facing some numerical errors in a noise free scenario even using float64 precision. I would like to now if pytorch does any approximation when calling the cholesky solver method.
Basically if X
are my training locations and Y
my observations. The posterior mean at locations X*=X
should be equal to Y
in a noise free scenario.
This posterior mean is given by: pos_mean = K(x*,x) @ K(x,x)^{-1}Y
for a zero mean GP. In pytorch this is coded by:
# X represent training points and X* points where the posterior wants to be computed.
# This post asks for the case in which X*=X but the code presented is general.
# K_xsx_t represents the kernel K(X*,X).
# K_xx represents the kernel K(X,X)
Lxx_t = psd_safe_cholesky(Kxx.transpose(1,2),upper = False)
K_xsx_t = K_xsx.transpose(1,2)
# compute the solver and transpose
lhs = torch.cholesky_solve(Kxsx_t, Lxx_t, upper = False).transpose(1,2)
pos_mean = torch.matmul(lhs,Y)
torch.sqrt((pos_mean-Y)**2).sum() is different from zero or from a small value