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