高斯过程(Gaussian Process, GP)是概率论与统计学中一种重要的随机过程,近年来在机器学习领域展现出强大的建模能力。不同于传统的参数化模型,GP属于非参数模型,能够以概率分布的形式描述函数空间中的不确定性。
从数学角度看,高斯过程可以定义为在连续域上无限多个随机变量的集合,这些变量的任意有限子集都服从联合高斯分布。这种特性使得GP成为函数分布的理想描述工具。具体来说,一个高斯过程完全由其均值函数m(x)和协方差函数k(x,x')确定:
f(x) ~ GP(m(x), k(x,x'))
其中均值函数通常取为零(经过数据归一化后),而协方差函数(又称核函数)的选择直接影响模型的表达能力。常见的核函数包括:
实际应用中,核函数的选择需要结合具体问题的先验知识。例如处理物理实验数据时,若已知系统存在周期性变化,则应优先考虑周期核与其他核的组合。
用生活场景类比,想象你在登山过程中记录海拔高度。虽然无法预先知道整条路径的确切高度,但可以根据当前地形(如坡度变化)预测后续路径的可能范围。高斯过程的作用类似——它不给出确定的预测值,而是提供每个预测点的概率分布(均值和方差)。
这种特性带来两大优势:
从高斯过程中采样,本质上是生成符合指定协方差结构的随机函数。具体实现步骤如下:
matlab复制% MATLAB实现示例
x = linspace(-5,5,100)';
l = 1.0; sigma = 1.0;
K = sigma^2 * exp(-(x - x').^2 / (2*l^2));
L = chol(K + 1e-6*eye(length(x))); % 加入小扰动确保正定
u = randn(length(x),1);
f = L * u;
plot(x,f);
核参数对采样结果的影响非常显著:
通过调整这些参数,可以生成符合不同先验知识的函数样本。这在贝叶斯优化中特别有用,因为合适的先验能显著提高优化效率。
实际采样时,建议先固定随机种子(如
rng(42))以便结果复现。同时注意协方差矩阵的条件数,必要时可添加jitter项(1e-6量级)保证数值稳定性。
高斯过程回归的核心思想是:假设观测数据来自一个受噪声干扰的高斯过程。模型表示为:
y = f(x) + ε, ε ~ N(0,σₙ²)
给定训练数据X,y,对新输入x*的预测服从联合高斯分布。通过条件概率推导,可得预测分布:
f*|X,y,x* ~ N(μ*, Σ*)
其中:
μ* = K(x*,X)[K(X,X) + σₙ²I]⁻¹y
Σ* = K(x*,x*) - K(x*,X)[K(X,X) + σₙ²I]⁻¹K(X,x*)
matlab复制function [mu, sigma] = gp_regression(X, y, x_star, l, sigma_f, sigma_n)
% 计算核矩阵
K = sigma_f^2 * exp(-pdist2(X,X).^2/(2*l^2));
K_star = sigma_f^2 * exp(-pdist2(x_star,X).^2/(2*l^2));
K_star_star = sigma_f^2 * exp(-pdist2(x_star,x_star).^2/(2*l^2));
% 添加噪声项
K = K + sigma_n^2 * eye(size(K));
% 计算预测均值和方差
L = chol(K,'lower');
alpha = L'\(L\y);
mu = K_star * alpha;
v = L \ K_star';
sigma = diag(K_star_star - v'*v);
end
% 使用示例
X = [1;2;3;4]; y = [1;3;2;4];
x_star = linspace(0,5,100)';
[mu, sigma] = gp_regression(X, y, x_star, 1.0, 1.0, 0.1);
高斯过程的性能很大程度上取决于核参数的选择。常用的优化方法包括:
极大似然估计(MLE):
通过最大化边缘似然函数确定参数:
log p(y|X) = -½yᵀ(K+σₙ²I)⁻¹y - ½log|K+σₙ²I| - n/2 log2π
交叉验证:
将数据分为训练集和验证集,通过网格搜索寻找最优参数
matlab复制% 边缘似然优化示例
fun = @(theta) -gp_log_likelihood(X, y, exp(theta(1)), exp(theta(2)), exp(theta(3)));
theta0 = log([1,1,0.1]);
theta_opt = fminunc(fun, theta0);
l_opt = exp(theta_opt(1)); sigma_f_opt = exp(theta_opt(2)); sigma_n_opt = exp(theta_opt(3));
高斯过程实现中常见的数值问题包括:
经验表明,当数据维度超过1000时,建议考虑使用近似方法如随机傅里叶特征(RFF)或诱导点法。
标准GP的复杂度为O(n³),以下方法可提升计算效率:
matlab复制% 稀疏GP示例(使用100个诱导点)
m = 100; idx = randperm(length(X),m);
Z = X(idx,:);
K_mm = sigma_f^2 * exp(-pdist2(Z,Z).^2/(2*l^2)) + 1e-6*eye(m);
K_nm = sigma_f^2 * exp(-pdist2(X,Z).^2/(2*l^2));
K_mn = K_nm';
alpha = K_mn / (K_mm + K_mn'*K_mn/(sigma_n^2)) * y;
预测方差不合理增大:
拟合结果过于平滑:
计算时间过长:
当需要同时建模多个相关任务时,可通过核心化方法(coregionalization)构建多输出GP。核心思想是使用任务间的协方差矩阵W:
cov(fᵢ(x),fⱼ(x')) = k(x,x') × Wᵢⱼ
这种方法在推荐系统、气候建模等领域有广泛应用。
对于分类问题(二分类或多分类),需要使用拉普拉斯近似或变分推断等方法处理非高斯似然。关键步骤包括:
matlab复制% 二分类GP示例(使用逻辑似然)
sigmoid = @(x) 1./(1+exp(-x));
K = ... % 计算训练核矩阵
f_mode = find_mode(X, y, K); % 需要优化求解
[L,~] = chol(K + diag(sigmoid(f_mode).*(1-sigmoid(f_mode))));
现代研究中的几个有趣方向:
我在实际项目中发现,将GP与简单神经网络结合(如用MLP学习特征,再接GP回归),往往能在保持可解释性的同时提升非线性建模能力。特别是在小样本场景下,这种混合架构表现出明显优势。