使用高斯过程进行非线性预测建模

Beginner

This tutorial is from open-source community. Access the source code

简介

高斯过程回归是一种统计建模技术,用于基于输入变量预测目标变量的结果。该技术将目标变量的分布建模为高斯过程,高斯过程是一组随机变量,其中任意有限数量的随机变量都具有联合高斯分布。在输入变量和目标变量之间的关系为非线性的情况下,该技术特别有用。

在本实验中,我们将学习如何使用 Python 中的 scikit-learn 库进行带噪声水平估计的高斯过程回归。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

数据生成

在这一步中,我们将使用正弦函数生成一些具有单个特征的数据。

import numpy as np

def target_generator(X, add_noise=False):
    target = 0.5 + np.sin(3 * X)
    if add_noise:
        rng = np.random.RandomState(1)
        target += rng.normal(0, 0.3, size=target.shape)
    return target.squeeze()

X = np.linspace(0, 5, num=30).reshape(-1, 1)
y = target_generator(X, add_noise=False)

数据可视化

在这一步中,我们将可视化生成的数据。

import matplotlib.pyplot as plt

plt.plot(X, y, label="Expected signal")
plt.legend()
plt.xlabel("X")
_ = plt.ylabel("y")

添加噪声

在这一步中,我们将向生成的数据中添加一些噪声,以创建一个更现实的训练数据集。

rng = np.random.RandomState(0)
X_train = rng.uniform(0, 5, size=20).reshape(-1, 1)
y_train = target_generator(X_train, add_noise=True)

数据可视化

在这一步中,我们将把有噪声的训练数据集与预期信号一起进行可视化。

plt.plot(X, y, label="Expected signal")
plt.scatter(
    x=X_train[:, 0],
    y=y_train,
    color="black",
    alpha=0.4,
    label="Observations",
)
plt.legend()
plt.xlabel("X")
_ = plt.ylabel("y")

高斯过程回归

在这一步中,我们将使用一个加法核来创建一个高斯过程回归器,该加法核添加了一个径向基函数(RBF)核和一个白噪声核(WhiteKernel)。白噪声核是一个能够估计数据中存在的噪声量的核,而径向基函数核将用于拟合数据与目标之间的非线性关系。

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

kernel = 1.0 * RBF(length_scale=1e-1, length_scale_bounds=(1e-2, 1e3)) + WhiteKernel(
    noise_level=1e-2, noise_level_bounds=(1e-10, 1e1)
)
gpr = GaussianProcessRegressor(kernel=kernel, alpha=0.0)
gpr.fit(X_train, y_train)
y_mean, y_std = gpr.predict(X, return_std=True)

数据可视化

在这一步中,我们将可视化高斯过程回归器所做的预测。

plt.plot(X, y, label="Expected signal")
plt.scatter(x=X_train[:, 0], y=y_train, color="black", alpha=0.4, label="Observations")
plt.errorbar(X, y_mean, y_std)
plt.legend()
plt.xlabel("X")
plt.ylabel("y")
_ = plt.title(
    (
        f"初始值:{kernel}\n最优值:{gpr.kernel_}\n对数边缘似然:"
        f"{gpr.log_marginal_likelihood(gpr.kernel_.theta)}"
    ),
    fontsize=8,
)

对数边缘似然

在这一步中,我们将检查高斯过程回归器(GaussianProcessRegressor)对于不同超参数的对数边缘似然(LML),以了解局部最小值的情况。

from matplotlib.colors import LogNorm

length_scale = np.logspace(-2, 4, num=50)
noise_level = np.logspace(-2, 1, num=50)
length_scale_grid, noise_level_grid = np.meshgrid(length_scale, noise_level)

log_marginal_likelihood = [
    gpr.log_marginal_likelihood(theta=np.log([0.36, scale, noise]))
    for scale, noise in zip(length_scale_grid.ravel(), noise_level_grid.ravel())
]
log_marginal_likelihood = np.reshape(
    log_marginal_likelihood, newshape=noise_level_grid.shape
)

vmin, vmax = (-log_marginal_likelihood).min(), 50
level = np.around(np.logspace(np.log10(vmin), np.log10(vmax), num=50), decimals=1)
plt.contour(
    length_scale_grid,
    noise_level_grid,
    -log_marginal_likelihood,
    levels=level,
    norm=LogNorm(vmin=vmin, vmax=vmax),
)
plt.colorbar()
plt.xscale("log")
plt.yscale("log")
plt.xlabel("Length-scale")
plt.ylabel("Noise-level")
plt.title("Log-marginal-likelihood")
plt.show()

总结

在这个实验中,我们学习了如何使用 Python 中的 scikit-learn 库,通过高斯过程回归进行噪声水平估计。我们使用正弦函数生成了一些具有单个特征的数据,向生成的数据中添加了一些噪声,以创建一个更现实的训练数据集,并对生成的数据进行了可视化。我们使用一个加法核(添加了径向基函数核和白噪声核)创建了一个高斯过程回归器,并对高斯过程回归器所做的预测进行了可视化。我们还检查了高斯过程回归器对于不同超参数的对数边缘似然(LML),以了解局部最小值的情况。

总结

恭喜你!你已经完成了高斯过程回归实验。你可以在 LabEx 中练习更多实验来提升你的技能。