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

高斯过程回归是一种强大的非参数回归方法,它通过概率模型来预测连续值。本文将通过两个不同的案例来展示高斯过程回归的基本原理:一个是没有噪声的情况,另一个是有已知噪声水平的情况。在这两种情况下,都会使用最大似然原理来估计核函数的参数。通过图表,可以观察到高斯过程模型的插值特性以及其概率性质,表现为点估计的95%置信区间。

数据集生成

首先,将生成一个合成数据集。真实的生成过程定义为f(x) = x * sin(x)。使用NumPy库来生成数据点,并使用Matplotlib库来绘制真实的生成过程。

import numpy as np X = np.linspace(start=0, stop=10, num=1000).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("真实生成过程")

将使用这个数据集进行下一个实验,以展示高斯过程回归是如何工作的。

无噪声目标的示例

在这个第一个示例中,将使用没有添加任何噪声的真实生成过程。为了训练高斯过程回归,只选择少数样本。将使用径向基函数(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) 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="观测值") plt.plot(X, mean_prediction, label="平均预测") plt.fill_between(X.ravel(), mean_prediction - 1.96 * std_prediction, mean_prediction + 1.96 * std_prediction, alpha=0.5, label="95%置信区间") plt.legend() plt.xlabel("$x$") plt.ylabel("$f(x)$") plt.title("无噪声数据集上的高斯过程回归")

可以看到,对于接近训练集的数据点的预测,95%置信区间的幅度较小。每当样本远离训练数据时,模型的预测准确性较低,模型预测的不确定性更高(不确定性更大)。

有噪声目标的示例

可以重复类似的实验,这次在目标上添加额外的噪声。这将允许看到噪声对拟合模型的影响。向目标添加了一些随机高斯噪声,并设定了一个任意的标准差。

noise_std = 0.75 y_train_noisy = y_train + rng.normal(loc=0.0, scale=noise_std, size=y_train.shape) 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="观测值") plt.plot(X, mean_prediction, label="平均预测") plt.fill_between(X.ravel(), mean_prediction - 1.96 * std_prediction, mean_prediction + 1.96 * std_prediction, color="tab:orange", alpha=0.5, label="95%置信区间") plt.legend() plt.xlabel("$x$") plt.ylabel("$f(x)$") plt.title("有噪声数据集上的高斯过程回归")

噪声会影响接近训练样本的预测:预测的不确定性在训练样本附近更大,因为明确地模拟了一个给定水平的目标噪声,与输入变量无关。

(0分钟0.521秒)

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485