高斯过程回归:基本入门示例#

一个以两种不同方式计算的简单一维回归示例

  1. 无噪声情况

  2. 每个数据点噪声水平已知的噪声情况

在这两种情况下,核的参数都使用最大似然原理进行估计。

这些图说明了高斯过程模型的插值特性及其以逐点 95% 置信区间形式存在的概率性质。

请注意,alpha 是一个参数,用于控制假设训练点协方差矩阵上的 Tikhonov 正则化强度。

# Author: Vincent Dubourg <[email protected]>
#         Jake Vanderplas <[email protected]>
#         Jan Hendrik Metzen <[email protected]>
#         Guillaume Lemaitre <[email protected]>
# License: BSD 3 clause

数据集生成#

我们将首先生成一个合成数据集。真正的生成过程定义为 \(f(x) = x \sin(x)\)

import numpy as np

X = np.linspace(start=0, stop=10, num=1_000).reshape(-1, 1)
y = np.squeeze(X * np.sin(X))
import matplotlib.pyplot as plt

plt.plot(X, y, label=r"$f(x) = x \sin(x)$", linestyle="dotted")
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("True generative process")
True generative process

我们将在下一个实验中使用此数据集来说明高斯过程回归是如何工作的。

无噪声目标示例#

在第一个示例中,我们将使用真实的生成过程,不添加任何噪声。为了训练高斯过程回归,我们只会选择几个样本。

rng = np.random.RandomState(1)
training_indices = rng.choice(np.arange(y.size), size=6, replace=False)
X_train, y_train = X[training_indices], y[training_indices]

现在,我们在这些训练数据样本上拟合高斯过程。我们将使用径向基函数 (RBF) 核和一个常数参数来拟合振幅。

from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF

kernel = 1 * RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e2))
gaussian_process = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=9)
gaussian_process.fit(X_train, y_train)
gaussian_process.kernel_
5.02**2 * RBF(length_scale=1.43)

拟合模型后,我们看到核的超参数已经过优化。现在,我们将使用核来计算完整数据集的平均预测值并绘制 95% 置信区间。

mean_prediction, std_prediction = gaussian_process.predict(X, return_std=True)

plt.plot(X, y, label=r"$f(x) = x \sin(x)$", linestyle="dotted")
plt.scatter(X_train, y_train, label="Observations")
plt.plot(X, mean_prediction, label="Mean prediction")
plt.fill_between(
    X.ravel(),
    mean_prediction - 1.96 * std_prediction,
    mean_prediction + 1.96 * std_prediction,
    alpha=0.5,
    label=r"95% confidence interval",
)
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("Gaussian process regression on noise-free dataset")
Gaussian process regression on noise-free dataset

我们看到,对于对接近训练集中某个数据点的点进行的预测,95% 置信区间的幅度很小。每当样本远离训练数据时,我们模型的预测就不那么准确,模型预测的精度也较低(不确定性更高)。

有噪声目标示例#

我们可以重复一个类似的实验,这次向目标添加额外的噪声。这将允许查看噪声对拟合模型的影响。

我们向目标添加一些随机高斯噪声,并使用任意标准差。

noise_std = 0.75
y_train_noisy = y_train + rng.normal(loc=0.0, scale=noise_std, size=y_train.shape)

我们创建了一个类似的高斯过程模型。除了核之外,这次我们还指定了参数 alpha,它可以解释为高斯噪声的方差。

gaussian_process = GaussianProcessRegressor(
    kernel=kernel, alpha=noise_std**2, n_restarts_optimizer=9
)
gaussian_process.fit(X_train, y_train_noisy)
mean_prediction, std_prediction = gaussian_process.predict(X, return_std=True)

让我们像以前一样绘制平均预测和不确定性区域。

plt.plot(X, y, label=r"$f(x) = x \sin(x)$", linestyle="dotted")
plt.errorbar(
    X_train,
    y_train_noisy,
    noise_std,
    linestyle="None",
    color="tab:blue",
    marker=".",
    markersize=10,
    label="Observations",
)
plt.plot(X, mean_prediction, label="Mean prediction")
plt.fill_between(
    X.ravel(),
    mean_prediction - 1.96 * std_prediction,
    mean_prediction + 1.96 * std_prediction,
    color="tab:orange",
    alpha=0.5,
    label=r"95% confidence interval",
)
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("Gaussian process regression on a noisy dataset")
Gaussian process regression on a noisy dataset

噪声会影响靠近训练样本的预测:靠近训练样本的预测不确定性更大,因为我们明确地对独立于输入变量的给定水平目标噪声进行建模。

脚本总运行时间:(0 分钟 0.554 秒)

相关示例

核岭回归和高斯过程回归的比较

核岭回归和高斯过程回归的比较

高斯过程回归 (GPR) 估计数据噪声水平的能力

高斯过程回归 (GPR) 估计数据噪声水平的能力

使用高斯过程回归 (GPR) 预测莫纳罗亚数据集上的 CO2 水平

使用高斯过程回归 (GPR) 预测莫纳罗亚数据集上的 CO2 水平

XOR 数据集上高斯过程分类 (GPC) 的说明

XOR 数据集上高斯过程分类 (GPC) 的说明

由 Sphinx-Gallery 生成的图库