不愧是北理博士,强悍。。

文摘   2024-09-09 17:35   北京  

你好,我是kk~

今儿社群一位北理工的博士分享了「高斯过程」的一个描述,非常非常详细。

完整的整理后,给大家分享出来~

首先,高斯过程(Gaussian Process, GP)是一种用于非参数贝叶斯推断的强大工具,常用于回归、分类以及更广泛的机器学习任务中。高斯过程的核心思想是定义一个分布,这个分布是函数的分布,而不是仅仅是变量的分布。通过高斯过程,我们可以对未知函数进行推断,同时保留不确定性信息。

1. 基本概念

1.1 高斯过程的定义

高斯过程是指任意有限维度上的随机变量的联合分布都是高斯分布的过程。具体来说,如果有一个函数  ,对于任意的有限集合 ,对应的函数值  是一个多元高斯分布,则称  是一个高斯过程。

高斯过程可以被完全定义为:

这里:

  •  是均值函数,通常假设为 0,表示对于任意输入 ,函数  的均值。
  •  是协方差函数或核函数,定义了任意两个输入点之间的相关性。

2. 核心原理

2.1 多元高斯分布

在理解高斯过程之前,首先需要理解多元高斯分布。一个 n 维的多元高斯分布  可以表示为:

其中  是一个 n 维向量, 是均值向量,   的协方差矩阵。其概率密度函数为:

高斯过程的一个关键性质是:任何有限个采样点上的函数值都服从多元高斯分布。

2.2 高斯过程回归的推断

假设我们有一个观测数据集 ,其中   是独立同分布的噪声,通常假设 

我们希望通过已有的观测数据来预测某个新点  处的函数值 

2.2.1 联合分布

假设输入数据点 $ {x_1, x_2, \dots, x_n, x_}  {f_1, f_2, \dots, f_n, f_} $,根据高斯过程的定义,这些点的联合分布是多元高斯分布:

其中  是一个  的矩阵,表示训练数据点之间的协方差,$ K(X, x_)  n \times 1  K(x_, x_*) $ 是新点自身的协方差。

2.2.2 条件分布

根据多元高斯分布的性质,可以得到给定观测数据  后,  的条件分布:

其中均值和方差分别为:

其中:

  • $ \bar{f_}  x_ $ 的预测均值。
  •  是预测不确定性的度量。
2.2.3 预测输出的分布

如果假设均值函数 ,则有:

这个公式的直观理解是:高斯过程利用核函数  来度量不同数据点之间的相似性,然后基于这种相似性通过观测数据进行推断。预测的不确定性由观测数据与新点之间的距离以及数据的噪声决定。

3. 核函数的选择

核函数  是高斯过程的核心部分,它决定了函数的光滑性、周期性等特性。常见的核函数包括:

  • 线性核: 
  • 平方指数核(RBF 核): ,其中  是长度尺度参数,控制函数的平滑性。
  • Matérn 核: 这是平方指数核的广义版本,能够表达不同的平滑度。

不同的核函数适用于不同类型的问题,在实际应用中通常通过最大化对数似然函数来学习核函数的超参数。

4. 高斯过程的优缺点

优点:

  • 高斯过程具有非参数性质,可以灵活地适应不同的函数形态。
  • 能够提供预测的不确定性估计,适用于需要不确定性信息的场景。
  • 可以自然地处理小样本问题。

缺点:

  • 计算复杂度高,训练阶段为 ,因此不适合处理大规模数据。
  • 预测阶段需要存储所有训练数据,内存占用较大。

高斯过程通过定义在函数上的概率分布,实现了对未知函数的贝叶斯推断。通过选取合适的核函数,高斯过程能够灵活地适应不同类型的数据,并且提供了预测值的不确定性信息。尽管计算复杂度较高,但高斯过程在许多小规模数据问题中表现出色,特别是在需要不确定性度量的场景中。

案例分享

假设我们有一些来自某物理系统的实验数据,但这些数据中存在噪声。我们希望使用高斯过程来预测该系统在新输入点的表现,并估计预测的不确定性。我们还将可视化高斯过程的回归结果,包括数据拟合、预测分布、置信区间,以及对核函数的影响。

代码实现

我们使用scikit-learn库中的GaussianProcessRegressorGaussianProcessClassifier来实现高斯过程回归。然后,我们将绘制预测结果和不确定性。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C

# 生成虚拟数据集
def f(x):
    return np.sin(x)

# 设置随机种子
np.random.seed(1)

# 生成观测数据
X = np.random.uniform(01015).reshape(-11)
y = f(X).ravel() + np.random.normal(00.1, X.shape[0])

# 为预测生成更密集的点
X_pred = np.linspace(0101000).reshape(-11)

# 定义核函数
kernel = C(1.0, (1e-41e1)) * RBF(1.0, (1e-21e2))

# 初始化高斯过程回归模型
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10, alpha=0.1)

# 模型拟合
gp.fit(X, y)

# 进行预测
y_pred, sigma = gp.predict(X_pred, return_std=True)

# 创建图形
plt.figure(figsize=(148))

# 绘制真实函数
plt.plot(X_pred, f(X_pred), 'r:', label='True function')

# 绘制观测数据点
plt.errorbar(X, y, 0.1, fmt='r.', markersize=10, label='Observations')

# 绘制预测均值
plt.plot(X_pred, y_pred, 'b-', label='Prediction')

# 绘制置信区间
plt.fill_between(X_pred.ravel(), 
                 y_pred - 1.96 * sigma, 
                 y_pred + 1.96 * sigma, 
                 alpha=0.5, color='k', label='95% Confidence Interval')

# 设置图形细节
plt.title('Gaussian Process Regression')
plt.xlabel('Input')
plt.ylabel('Output')
plt.legend(loc='upper left')
plt.grid(True)
plt.show()

# 绘制核函数对预测的影响
plt.figure(figsize=(148))

# 生成不同的长度尺度
length_scales = [0.11.010.0]

for i, length_scale in enumerate(length_scales):
    kernel = C(1.0, (1e-41e1)) * RBF(length_scale, (1e-21e2))
    gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10, alpha=0.1)
    gp.fit(X, y)
    y_pred, sigma = gp.predict(X_pred, return_std=True)
    
    plt.subplot(31, i + 1)
    plt.plot(X_pred, f(X_pred), 'r:', label='True function')
    plt.errorbar(X, y, 0.1, fmt='r.', markersize=10, label='Observations')
    plt.plot(X_pred, y_pred, 'b-', label=f'Prediction (length_scale={length_scale})')
    plt.fill_between(X_pred.ravel(), 
                     y_pred - 1.96 * sigma, 
                     y_pred + 1.96 * sigma, 
                     alpha=0.5, color='k', label='95% Confidence Interval')
    plt.title(f'Length Scale = {length_scale}')
    plt.xlabel('Input')
    plt.ylabel('Output')
    plt.legend(loc='upper left')
    plt.grid(True)

plt.tight_layout()
plt.show()

1. 数据生成

首先,我们生成一个简单的虚拟数据集,使用一个带噪声的正弦函数来模拟实验数据。这些数据点随机分布在 [0, 10] 的范围内。

def f(x):
    return np.sin(x)

X = np.random.uniform(01015).reshape(-11)
y = f(X).ravel() + np.random.normal(00.1, X.shape[0])

2. 高斯过程模型

我们使用RBF核函数,并且设置不同的长度尺度来测试模型的性能。GaussianProcessRegressor类是scikit-learn中的高斯过程回归实现。

kernel = C(1.0, (1e-41e1)) * RBF(1.0, (1e-21e2))
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10, alpha=0.1)
gp.fit(X, y)

3. 预测与可视化

高斯过程不仅可以给出预测的均值,还可以给出置信区间,我们通过绘制真实函数、预测值以及 95% 置信区间来可视化结果。

y_pred, sigma = gp.predict(X_pred, return_std=True)
plt.plot(X_pred, f(X_pred), 'r:', label='True function')
plt.errorbar(X, y, 0.1, fmt='r.', markersize=10, label='Observations')
plt.plot(X_pred, y_pred, 'b-', label='Prediction')
plt.fill_between(X_pred.ravel(), 
                 y_pred - 1.96 * sigma, 
                 y_pred + 1.96 * sigma, 
                 alpha=0.5, color='k', label='95% Confidence Interval')

4. 核函数对预测的影响

我们通过改变RBF核的长度尺度,展示核函数对高斯过程回归结果的影响。

length_scales = [0.11.010.0]

for i, length_scale in enumerate(length_scales):
    kernel = C(1.0, (1e-41e1)) * RBF(length_scale, (1e-21e2))
    gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10, alpha=0.1)
    gp.fit(X, y)
    y_pred, sigma = gp.predict(X_pred, return_std=True)
    ...

输出图像

预测结果与置信区间:展示了高斯过程如何拟合数据并且提供置信区间。这幅图清晰地展示了预测均值及其不确定性区域。

不同长度尺度的影响:展示了不同的核函数参数对高斯过程预测的影响。较小的长度尺度导致了对数据点的过拟合,而较大的长度尺度则导致过于平滑的拟合。

高斯过程适用于小规模数据的回归问题。通过调整核函数及其超参数,高斯过程可以灵活地适应不同的数据结构,并且提供预测的不确定性信息。在实际应用中,高斯过程非常适合需要预测不确定性度量的场景,如物理实验、时间序列分析等。

kk机器学习算法
机器学习基础、计算机视觉…
 最新文章