【发布时间】:2019-07-26 01:05:31
【问题描述】:
在 scikit-learn 中有两种方法可以指定高斯过程回归 (GPR) 的噪声级别。
第一种方法是在 GaussianProcessRegressor 类的构造函数中指定参数 alpha,它只是按预期将值添加到对角线。
第二种方法是将内核中的噪声级别与WhiteKernel结合起来。
GaussianProcessRegressor 的文档(请参阅 documentation here)说,指定 alpha 是“相当于添加带有 c=alpha 的 WhiteKernel” .然而,我正在经历一种不同的行为,并想找出原因是什么(当然,“正确”的方式或“真相”是什么)。
这是一个代码 sn-p 为函数 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,但无法找出问题所在。或者,也许我只是在监督某些事情,并且输出非常有意义。
有没有人知道这里发生了什么或有类似的经历?
非常感谢!
【问题讨论】:
-
该问题已在 PR #15990 中讨论、解决和合并。
标签: python scikit-learn