因为我需要在大量点上训练我的 GP,所以我不仅想保存优化的超参数
ker = GPy.kern.Matern32(nc, ARD=True)
m = GPy.models.GPRegression(xTrain, np.reshape(yTrain, (-1, 1)), ker, noise_var=1e-8)
m.Mat32.lengthscale.constrain_bounded(0.01, 5e0)
m.Mat32.variance.constrain_bounded(1e-4, 1e+10)
m.Gaussian_noise.variance.constrain_fixed(1e-8)
m.optimize_restarts(messages=True, num_restarts=1, max_f_eval=10000)
np.save(f, m.param_array)
yPrd, yVar = m.predict_noiseless(xTest)
yStd = np.sqrt(yVar)
yPred = np.squeeze(yPrd)
还要保存 Gram 矩阵与观测值 K(s,s)^{-1 的乘法} f in
后验平均值 = K(s^*,s)K(s,s)^{-1} f
从而加载块 K(s,s)^{-1} f并仅与相应的测试点 K(s^*,s) 执行 1 次乘法。我如何访问/输出这些矩阵/保存它们?
可以通过访问
posterior
对象中的
woodbury_vector
属性来访问存储在的 GPy 回归模型中的 Woodbury 向量,该向量表示为
K(X, X) + noise * I
的逆矩阵乘以目标值 (
yTrain
)。这是一个更有效的存储后验的方法,尤其是对于大型数据集而言。
以下是如何执行此操作以及如何使用它来进行预测:
import GPy
import numpy as np
# ...(的现有代码用于训练 GP 模型)...
# 访问 Woodbury 向量(K(s, s) + noise * I)^-1 * f
woodbury_vector = m.posterior.woodbury_vector
# 保存 Woodbury 向量以及超参数
np.save(f, m.param_array) # 可能希望对 Woodbury 向量使用不同的文件
np.save('woodbury_vector.npy', woodbury_vector)
# ...(稍后,加载模型和 Woodbury 向量)...
m = GPy.models.GPRegression.load_model(f)
woodbury_vector = np.load('woodbury_vector.npy')
# 进行预测
kernel = m.kern.copy() # 复制内核以用于预测
y_pred, y_var = m.predict(xTest, kern=kernel, full_cov=False, Y_metadata=None, woodbury_vector=woodbury_vector)
# ...(其余代码与以前相同)...
说明:
-
访问 Woodbury 向量:
通过
m.posterior.woodbury_vector
访问训练好的 GP 模型m
的 Woodbury 向量。 -
保存 Woodbury 向量:
使用
np.save()
将 Woodbury 向量以及模型参数和其他必要数据保存到文件中。 -
加载模型和 Woodbury 向量:
使用
GPy.models.GPRegression.load_model()
加载保存的 GP 模型,并使用np.load()
加载保存的 Woodbury 向量。 -
使用 Woodbury 向量进行预测:
调用
m.predict()
函数,传递加载的 Woodbury 向量以及其他必要参数。woodbury_vector
参数告诉 GPy 使用此向量进行预测而不是重新计算。
此方法允许有效地存储表示
(K(s,s) + noise * I)^-1 * f
的信息,并在以后用于预测,而无需存储或反转完整的 Gram 矩阵,这对于大型数据集来说在计算上可能非常昂贵。