我想计算 GPFlow 中 GP 回归的协方差矩阵的行列式。我猜我可以用这个函数得到协方差矩阵:
GPModel.predict_f_full_cov
这里建议使用此功能:
https://gpflow.readthedocs.io/en/develop/notebooks/regression.html
但是,我不知道如何使用这个函数或它返回什么。我需要知道一个返回整个模型的协方差矩阵的函数,然后我需要知道如何计算它的行列式。
经过一番努力,我想出了如何给 predict_f_full_cov 一些我感兴趣的点,如下所示:
c = m.predict_f_full_cov(np.array([[.2],[.4],[.6],[.8]])))
这返回了两个数组,其中第一个是我沿 x 轴要求的点的预测函数的平均值。第二个数组有点神秘。我猜这是协方差矩阵。我用这个把它拉出来:
covMatrix = m.predict_f_full_cov(np.array([[.2],[.4],[.6],[.8]]))[1][0]
然后我查找了如何计算行列式,如下所示:
x = np.linalg.det(covMatrix)
然后我计算了它的对数以获得协方差矩阵的熵:
print(-10*math.log(np.linalg.det(covMatrix)))
我使用两组不同的数据运行了两次。第一个噪音大,第二个噪音低。奇怪的是,低噪声数据集的熵上升了。我很茫然。
我发现,如果我只是在一个应该是线性的小区域上计算协方差矩阵,那么上下调整噪声不会达到我的预期。此外,如果我将 GP 回归到大量点,则行列式变为 0.0。
这是我正在使用的代码:
import gpflow
import numpy as np
N = 300
noiseSize = 0.01
X = np.random.rand(N,1)
Y = np.sin(12*X) + 0.66*np.cos(25*X) + np.random.randn(N,1)*noiseSize + 3
k = gpflow.kernels.Matern52(1, lengthscales=0.3)
m = gpflow.models.GPR(X, Y, kern=k)
m.likelihood.variance = 0.01
aRange = np.linspace(0.1,0.9,200)
newRange = []
for point in aRange:
newRange.append([point])
covMatrix = m.predict_f_full_cov(newRange)[1][0]
import math
print("Determinant: " + str(np.linalg.det(covMatrix)))
print(-10*math.log(np.linalg.det(covMatrix)))