有两种方法可以在scikit-learn中为高斯过程回归(GPR)指定噪声级别。
第一种方法是在 GaussianProcessRegressor 类的构造函数中指定参数 alpha ,该构造函数仅按预期向对角线添加值。
第二种方法是将噪声级别与 WhiteKernel 合并到内核中。
GaussianProcessRegressor (参见documentation here)的文档说,指定 alpha “等同于添加 WhiteKernel ,其中c = α”。但是,我正在经历一种不同的行为,并想找出原因(当然还有“正确”的方式或“真相”是什么)。
这是一个代码片段,为函数 f(x)= x ^ 2 的扰动版本绘制了两种不同的回归拟合,尽管它们应该显示相同的内容:
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as rnd
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import ConstantKernel as C, RBF, WhiteKernel
rnd.seed(0)
n = 40
xs = np.linspace(-1, 1, num=n)
noise = 0.1
kernel1 = C()*RBF() + WhiteKernel(noise_level=noise)
kernel2 = C()*RBF()
data = xs**2 + rnd.multivariate_normal(mean=np.zeros(n), cov=noise*np.eye(n))
gpr1 = GaussianProcessRegressor(kernel=kernel1, alpha=0.0, optimizer=None)
gpr1.fit(xs[:, np.newaxis], data)
gpr2 = GaussianProcessRegressor(kernel=kernel2, alpha=noise, optimizer=None)
gpr2.fit(xs[:, np.newaxis], data)
xs_plt = np.linspace(-1., 1., num=100)
for gpr in [gpr1, gpr2]:
pred, pred_std = gpr.predict(xs_plt[:, np.newaxis], return_std=True)
plt.figure()
plt.plot(xs_plt, pred, 'C0', lw=2)
plt.scatter(xs, data, c='C1', s=20)
plt.fill_between(xs_plt, pred - 1.96*pred_std, pred + 1.96*pred_std,
alpha=0.2, color='C0')
plt.title("Kernel: %s\n Log-Likelihood: %.3f"
% (gpr.kernel_, gpr.log_marginal_likelihood(gpr.kernel_.theta)),
fontsize=12)
plt.ylim(-1.2, 1.2)
plt.tight_layout()
plt.show()
我已经在研究scikit-learn软件包中的implementation,但是无法找出问题所在。或者也许我只是在监督一些事情,而输出才是合理的。
有人对这里发生的事情有任何了解吗?或者有类似的经历?
非常感谢!
答案 0 :(得分:1)
我在这里可能是错误的,但是我认为“指定alpha等同于“添加带有c = alpha的WhiteKernel”的主张”是不正确的。
设置GP回归噪声时,该噪声仅添加到训练点之间的协方差K
中。添加Whitenoise内核时,噪声也会添加到K**
,即测试点之间的协方差。
在您的情况下,测试点和训练点是相同的。但是,可能仍会创建三个不同的矩阵。这可能导致此处观察到的差异。
答案 1 :(得分:0)
我认为文档不正确。与此相关的信息,请参见github issue #13267。
在实践中,我要做的是将GP与WhiteKernel
配合使用,然后达到该标准。然后,我将该值添加到alpha
并重新计算必要的变量。一种更简单的选择是使用alpha
集和相同的长度比例但不适合它的新GP。
我应该指出,关于这是否是 right 方法,尚未得到普遍接受。我与一位同事进行了讨论,我们得出以下结论。这与来自实验误差的噪声数据有关
答案 2 :(得分:0)
https://gpflow.readthedocs.io/en/awav-documentation/notebooks/regression.html
也许您可以使用GPflow程序包,该程序包分别对潜函数f和观测值y(f +噪声)进行预测。
m.predict_f
返回点Xnew
上的潜在函数(f)的均值和方差。m.predict_y
返回新数据点的均值和方差(即包括噪声方差)。