使用scikit-learn的WhiteKernel进行高斯过程回归

时间:2019-03-04 16:56:23

标签: python scikit-learn

有两种方法可以在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,但是无法找出问题所在。或者也许我只是在监督一些事情,而输出才是合理的。

有人对这里发生的事情有任何了解吗?或者有类似的经历?

非常感谢!

3 个答案:

答案 0 :(得分:1)

我在这里可能是错误的,但是我认为“指定alpha等同于“添加带有c = alpha的WhiteKernel”的主张”是不正确的。

设置GP回归噪声时,该噪声仅添加到训练点之间的协方差K中。添加Whitenoise内核时,噪声也会添加到K**,即测试点之间的协方差。

在您的情况下,测试点和训练点是相同的。但是,可能仍会创建三个不同的矩阵。这可能导致此处观察到的差异。

答案 1 :(得分:0)

我认为文档不正确。与此相关的信息,请参见github issue #13267

在实践中,我要做的是将GP与WhiteKernel配合使用,然后达到该标准。然后,我将该值添加到alpha并重新计算必要的变量。一种更简单的选择是使用alpha集和相同的长度比例但不适合它的新GP。

我应该指出,关于这是否是 right 方法,尚未得到普遍接受。我与一位同事进行了讨论,我们得出以下结论。这与来自实验误差的噪声数据有关

  • 如果您想对GP进行抽样以预测具有更多独立测量结果的新实验,则想要 WhiteKernel
  • 如果您想采样可能的基础真相,则您想要WhiteKernel,因为您想要平滑的响应

答案 2 :(得分:0)

https://gpflow.readthedocs.io/en/awav-documentation/notebooks/regression.html

也许您可以使用GPflow程序包,该程序包分别对潜函数f和观测值y(f +噪声)进行预测。

  • m.predict_f返回点Xnew上的潜在函数(f)的均值和方差。
  • m.predict_y返回新数据点的均值和方差(即包括噪声方差)。