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

MTP*_*MTP 5 python scikit-learn

有两种方法可以指定 scikit-learn 中高斯过程回归 (GPR) 的噪声级别。

第一种方法是在GaussianProcessRegressor类的构造函数中指定参数alpha,它只是按预期将值添加到对角线。

第二种方法是使用WhiteKernel将噪声级别合并到内核中。

GaussianProcessRegressor的文档(请参阅此处的文档)表示指定alpha “相当于添加c=alpha 的WhiteKernel ”。然而,我正在经历一种不同的行为,并想找出其原因是什么(当然,“正确”的方式或“真相”是什么)。

下面是一个代码片段,绘制了函数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()
Run Code Online (Sandbox Code Playgroud)

我已经在研究scikit-learn 包中的实现,但无法找出问题所在。或者也许我只是在监督一些事情,而输出是完全有意义的。

有谁知道这里发生了什么或有类似的经历吗?

多谢!

Kje*_*idt 6

我在这里可能是错的,但我相信“指定 alpha 相当于添加一个 c=alpha 的 WhiteKernel”这一说法是非常不正确的。

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

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