def residual_kernel_matrix_kernel_real(Kx, Z, num_eig, ARD=True): """K_X|Z""" assert len(Kx) == len(Z) assert num_eig <= len(Kx) T = len(Kx) D = Z.shape[1] I = eye(T) eig_Kx, eix = truncated_eigen(*eigdec(Kx, num_eig)) rbf = RBF(D, ARD=ARD) white = White(D) gp_model = GPR(Z, 2 * sqrt(T) * eix @ diag(sqrt(eig_Kx)) / sqrt(eig_Kx[0]), rbf + white) gpflow.train.ScipyOptimizer().minimize(gp_model) sigma_squared = white.variance.value Kz_x = rbf.compute_K_symm(Z) P = I - Kz_x @ pdinv(Kz_x + sigma_squared * I) return P @ Kx @ P.T
def regression_distance(Y: np.ndarray, Z: np.ndarray, ard=True): """d(z,z') = |f(z)-f(z')| where Y=f(Z) + noise and f ~ GP""" import gpflow from gpflow.kernels import White, RBF from gpflow.models import GPR n, dims = Z.shape rbf = RBF(dims, ARD=ard) rbf_white = rbf + White(dims) gp_model = GPR(Z, Y, rbf_white) gpflow.train.ScipyOptimizer().minimize(gp_model) Kz_y = rbf.compute_K_symm(Z) Ry = pdinv(rbf_white.compute_K_symm(Z)) Fy = Y.T @ Ry @ Kz_y # F(z) M = Fy.T @ Fy O = np.ones((n, 1)) N = O @ (np.diag(M)[:, None]).T D = np.sqrt(N + N.T - 2 * M) return D, Kz_y