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 包中的实现,但无法找出问题所在。或者也许我只是在监督一些事情,而输出是完全有意义的。
有谁知道这里发生了什么或有类似的经历吗?
多谢!
我在这里可能是错的,但我相信“指定 alpha 相当于添加一个 c=alpha 的 WhiteKernel”这一说法是非常不正确的。
设置 GP 回归噪声时,噪声仅添加到K,即训练点之间的协方差。添加白噪声核时,噪声也会添加到K**测试点之间的协方差中。
在您的情况下,测试点和训练点是相同的。然而,这三个不同的矩阵可能仍然被创建。这可能会导致此处观察到的差异。
| 归档时间: |
|
| 查看次数: |
3607 次 |
| 最近记录: |