高斯过程回归(GPR)小白入门教程
0. 引言:为什么需要高斯过程回归?
在机器学习中,回归任务的目标是用已知数据拟合一个函数,预测新输入的输出。传统方法(如线性回归、多项式回归)存在明显局限:
- 线性回归假设输入输出是线性关系,无法拟合非线性数据;
- 多项式回归需要手动选择次数,次数过高易过拟合、过低易欠拟合;
- 大多数方法只能给出点估计(如y^\hat{y}y^),无法量化预测的不确定性(比如“预测值y^=5\hat{y}=5y^=5,但有95%的概率在[3,7]之间”)。
高斯过程回归(Gaussian Process Regression, GPR)是一种非参数概率模型,完美解决了上述问题:
- 天生支持非线性拟合,无需手动设计特征;
- 输出概率分布(均值+方差),直接给出不确定性;
- 基于贝叶斯框架,能结合先验知识(通过核函数)。
本文将从基础概念出发,一步步讲解GPR的原理与应用。
1. 背景溯源:从“确定函数”到“随机过程”
在传统回归中,我们认为“函数是确定的”——给定x,f(x)是一个固定值。但现实中,很多现象存在随机性(比如测量误差、未观测到的变量),因此更合理的假设是:每个x对应一个随机变量f(x),整个函数f(·)是这些随机变量的集合。
高斯过程(Gaussian Process, GP)是这类“函数随机过程”的典型代表:它假设任意有限个x对应的f(x)都服从联合高斯分布。换句话说,GPR用高斯分布描述“函数的不确定性”,通过观测到的训练数据(带噪声的f(x)),用条件高斯分布预测新x的输出分布。
2. 前置知识:高斯分布的“联合-条件”变换
GPR的核心是条件高斯分布,需先掌握单变量、联合、条件高斯的基本公式。
2.1 单变量高斯分布
若随机变量z∼N(μ,σ2)z \sim \mathcal{N}(\mu, \sigma^2)z∼N(μ,σ2),则其概率密度函数(PDF)为:
p(z)=12πσ2exp(−(z−μ)22σ2) p(z) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(z-\mu)^2}{2\sigma^2}\right)p(z)=2πσ21exp(−2σ2(z−μ)2)
其中μ\muμ是均值(中心位置),σ2\sigma^2σ2是方差(离散程度)。
2.2 联合高斯分布
若两个随机变量z1,z2z_1, z_2z1,z2服从联合高斯分布,记为:
[z1z2]∼N([μ1μ2],[Σ11Σ12Σ21Σ22]) \begin{bmatrix} z_1 \\ z_2 \end{bmatrix} \sim \mathcal{N}\left( \begin{bmatrix} \mu_1 \\ \mu_2 \end{bmatrix}, \begin{bmatrix} \Sigma_{11} & \Sigma_{12} \\ \Sigma_{21} & \Sigma_{22} \end{bmatrix} \right)[z1z2]∼N([μ1μ2],[Σ11Σ21Σ12Σ22])
其中:
- μ=[μ1,μ2]T\mu = [\mu_1, \mu_2]^Tμ=[μ1,μ2]T是均值向量(z1z_1z1的均值是μ1\mu_1μ1,z2z_2z2的均值是μ2\mu_2μ2);
- Σ\SigmaΣ是协方差矩阵(Σ11=Var(z1)\Sigma_{11} = \text{Var}(z_1)Σ11=Var(z1),Σ22=Var(z2)\Sigma_{22} = \text{Var}(z_2)Σ22=Var(z2),Σ12=Cov(z1,z2)=E[(z1−μ1)(z2−μ2)]\Sigma_{12} = \text{Cov}(z_1,z_2) = \mathbb{E}[(z_1-\mu_1)(z_2-\mu_2)]Σ12=Cov(z1,z2)=E[(z1−μ1)(z2−μ2)]);
- 协方差矩阵满足对称性(Σ12=Σ21\Sigma_{12} = \Sigma_{21}Σ12=Σ21)和半正定性(保证PDF非负)。
2.3 条件高斯分布(关键!)
若已知z2z_2z2的观测值z2=az_2 = az2=a,求z1z_1z1的条件分布z1∣z2=az_1 | z_2=az1∣z2=a。根据高斯分布的性质,条件分布仍为高斯分布,公式为:
z1∣z2=a∼N(μ1∣2,Σ1∣2) z_1 | z_2=a \sim \mathcal{N}\left( \mu_{1|2}, \Sigma_{1|2} \right)z1∣z2=a∼N(μ1∣2,Σ1∣2)
其中:
- 条件均值:μ1∣2=μ1+Σ12Σ22−1(a−μ2)\mu_{1|2} = \mu_1 + \Sigma_{12} \Sigma_{22}^{-1} (a - \mu_2)μ1∣2=μ1+Σ12Σ22−1(a−μ2)(用z2z_2z2的观测值修正z1z_1z1的先验均值)
- 条件方差:Σ1∣2=Σ11−Σ12Σ22−1Σ21\Sigma_{1|2} = \Sigma_{11} - \Sigma_{12} \Sigma_{22}^{-1} \Sigma_{21}Σ1∣2=Σ11−Σ12Σ22−1Σ21(观测z2z_2z2后,z1z_1z1的不确定性降低)
记住这个公式!GPR的预测就是用训练数据(对应z2z_2z2)修正预测点(对应z1z_1z1)的分布。
3. 高斯过程的数学定义
有了高斯分布的基础,我们可以正式定义高斯过程:
3.1 定义
一个随机过程{f(x)∣x∈X}\{f(x) | x \in \mathcal{X}\}{f(x)∣x∈X}(X\mathcal{X}X是输入空间,如Rd\mathbb{R}^dRd)是高斯过程,当且仅当:对任意有限个输入x1,x2,...,xn∈Xx_1, x_2, ..., x_n \in \mathcal{X}x1,x2,...,xn∈X,对应的随机向量[f(x1),f(x2),...,f(xn)]T[f(x_1), f(x_2), ..., f(x_n)]^T[f(x1),f(x2),...,f(xn)]T服从n维联合高斯分布。
高斯过程可简记为:
f(x)∼GP(m(x),k(x,x′)) f(x) \sim \mathcal{GP}\left( m(x), k(x, x') \right)f(x)∼GP(m(x),k(x,x′))
其中:
- m(x)=E[f(x)]m(x) = \mathbb{E}[f(x)]m(x)=E[f(x)]:均值函数(每个x对应f(x)的先验均值);
- k(x,x′)=Cov[f(x),f(x′)]=E[(f(x)−m(x))(f(x′)−m(x′))]k(x, x') = \text{Cov}[f(x), f(x')] = \mathbb{E}[(f(x)-m(x))(f(x')-m(x'))]k(x,x′)=Cov[f(x),f(x′)]=E[(f(x)−m(x))(f(x′)−m(x′))]:协方差函数(也叫核函数,描述两个输入x,x′x, x'x,x′对应的f(x)、f(x’)的相关性)。
3.2 核心结论:均值+核函数=高斯过程
高斯过程的所有性质都由均值函数和核函数完全决定!因为:
- 任意n个输入的联合均值向量是[m(x1),m(x2),...,m(xn)]T[m(x_1), m(x_2), ..., m(x_n)]^T[m(x1),m(x2),...,m(xn)]T;
- 联合协方差矩阵是Kn×nK_{n \times n}Kn×n,其中Kij=k(xi,xj)K_{ij} = k(x_i, x_j)Kij=k(xi,xj)(第i行j列是xix_ixi与xjx_jxj的协方差)。
3.3 常用核函数(协方差函数)
核函数是GPR的“灵魂”,它决定了函数f(x)的光滑性、周期性、局部性等性质。以下是最常用的核函数:
(1)平方指数(SE)核(光滑函数首选)
kSE(x,x′)=σf2exp(−∥x−x′∥22l2) k_{\text{SE}}(x, x') = \sigma_f^2 \exp\left( -\frac{\|x - x'\|^2}{2l^2} \right)kSE(x,x′)=σf2exp(−2l2∥x−x′∥2)
参数解释:
- σf2\sigma_f^2σf2:信号方差(控制f(x)的波动幅度,σf2\sigma_f^2σf2越大,函数越“起伏”);
- lll:长度尺度(控制f(x)的“局部性”,lll越小,函数越“敏感”于输入变化;lll越大,函数越“平坦”);
- ∥x−x′∥\|x - x'\|∥x−x′∥:输入xxx与x′x'x′的欧氏距离(衡量相似度)。
SE核的特点:
- 当x=x′x = x'x=x′时,k(x,x′)=σf2k(x,x') = \sigma_f^2k(x,x′)=σf2(f(x)自身的方差);
- 当xxx与x′x'x′距离增大时,k(x,x′)k(x,x')k(x,x′)指数衰减(输入越相似,f(x)与f(x’)的相关性越高);
- 对应光滑函数(因为协方差函数的光滑性等价于f(x)的光滑性)。
(2)其他常用核
- Matérn核:控制函数的光滑度(如Matérn 3/2对应一次可导,Matérn 5/2对应二次可导);
- 周期核:用于拟合周期性数据(如正弦曲线);
- 线性核:对应线性函数(退化为线性回归);
- ARD核:每个输入维度有独立的长度尺度(处理高维数据)。
3.4 核函数的性质
所有核函数必须满足:
- 对称性:k(x,x′)=k(x′,x)k(x, x') = k(x', x)k(x,x′)=k(x′,x)(协方差矩阵对称);
- 半正定性:对任意输入x1,...,xnx_1,...,x_nx1,...,xn,协方差矩阵Kij=k(xi,xj)K_{ij}=k(x_i,x_j)Kij=k(xi,xj)是半正定的(保证联合高斯分布合法)。
4. 高斯过程回归的完整推导
现在进入核心:用高斯过程解决带噪声的回归问题。
4.1 问题设定
我们有训练数据D={(xi,yi)}i=1n\mathcal{D} = \{(x_i, y_i)\}_{i=1}^nD={(xi,yi)}i=1n,其中:
- xix_ixi:d维输入(如“温度”“湿度”);
- yiy_iyi:观测输出(如“销量”“血压”);
- 噪声假设:yi=f(xi)+ϵiy_i = f(x_i) + \epsilon_iyi=f(xi)+ϵi,其中ϵi∼N(0,σn2)\epsilon_i \sim \mathcal{N}(0, \sigma_n^2)ϵi∼N(0,σn2)(独立同分布的高斯噪声,σn2\sigma_n^2σn2是噪声方差);
- 先验假设:f(x)∼GP(m(x),k(x,x′))f(x) \sim \mathcal{GP}(m(x), k(x, x'))f(x)∼GP(m(x),k(x,x′))(f(x)服从高斯过程)。
我们的目标是:给定新输入x∗x^*x∗,预测对应的输出y∗=f(x∗)+ϵ∗y^* = f(x^*) + \epsilon^*y∗=f(x∗)+ϵ∗的概率分布(ϵ∗\epsilon^*ϵ∗是新噪声,与ϵi\epsilon_iϵi独立)。
4.2 关键联合分布
首先,考虑训练数据的f向量f=[f(x1),f(x2),...,f(xn)]Tf = [f(x_1), f(x_2), ..., f(x_n)]^Tf=[f(x1),f(x2),...,f(xn)]T和预测点的f值f∗=f(x∗)f^* = f(x^*)f∗=f(x∗)。根据高斯过程的定义,它们的联合分布是高斯的:
[ff∗]∼N([mm∗],[KK∗K∗Tk∗∗]) \begin{bmatrix} f \\ f^* \end{bmatrix} \sim \mathcal{N}\left( \begin{bmatrix} m \\ m^* \end{bmatrix}, \begin{bmatrix} K & K_* \\ K_*^T & k_{**} \end{bmatrix} \right)[ff∗]∼N([mm∗],[KK∗TK∗k∗∗])
符号解释:
- m=[m(x1),m(x2),...,m(xn)]Tm = [m(x_1), m(x_2), ..., m(x_n)]^Tm=[m(x1),m(x2),...,m(xn)]T:训练点的先验均值向量;
- m∗=m(x∗)m^* = m(x^*)m∗=m(x∗):预测点的先验均值;
- KKK:训练点的协方差矩阵(Kij=k(xi,xj)K_{ij} = k(x_i, x_j)Kij=k(xi,xj),n×nn \times nn×n);
- K∗K_*K∗:训练点与预测点的协方差向量(K∗=[k(x1,x∗),k(x2,x∗),...,k(xn,x∗)]TK_* = [k(x_1, x^*), k(x_2, x^*), ..., k(x_n, x^*)]^TK∗=[k(x1,x∗),k(x2,x∗),...,k(xn,x∗)]T,n×1n \times 1n×1);
- k∗∗=k(x∗,x∗)k_{**} = k(x^*, x^*)k∗∗=k(x∗,x∗):预测点的自协方差(f∗f^*f∗的先验方差)。
4.3 观测值y的分布
由于y=f+ϵy = f + \epsilony=f+ϵ(ϵ=[ϵ1,...,ϵn]T\epsilon = [\epsilon_1, ..., \epsilon_n]^Tϵ=[ϵ1,...,ϵn]T),且ϵ∼N(0,σn2I)\epsilon \sim \mathcal{N}(0, \sigma_n^2 I)ϵ∼N(0,σn2I)(III是n阶单位矩阵),因此y的联合分布为:
y∼N(m,K+σn2I) y \sim \mathcal{N}\left( m, K + \sigma_n^2 I \right)y∼N(m,K+σn2I)
推导:
- 均值:E[y]=E[f+ϵ]=E[f]=m\mathbb{E}[y] = \mathbb{E}[f + \epsilon] = \mathbb{E}[f] = mE[y]=E[f+ϵ]=E[f]=m(噪声均值为0);
- 方差:Var(y)=Var(f)+Var(ϵ)=K+σn2I\text{Var}(y) = \text{Var}(f) + \text{Var}(\epsilon) = K + \sigma_n^2 IVar(y)=Var(f)+Var(ϵ)=K+σn2I(f与ϵ\epsilonϵ独立,方差相加)。
4.4 预测分布推导(核心步骤!)
我们需要求*预测点的f*和y的分布,即f∗∣D,x∗f^* | \mathcal{D}, x^*f∗∣D,x∗和y∗∣D,x∗y^* | \mathcal{D}, x^*y∗∣D,x∗。
步骤1:构造y与f^*的联合分布
由于y=f+ϵy = f + \epsilony=f+ϵ,且fff与f∗f^*f∗联合高斯,因此yyy与f∗f^*f∗的联合分布也是高斯的:
[yf∗]∼N([mm∗],[K+σn2IK∗K∗Tk∗∗]) \begin{bmatrix} y \\ f^* \end{bmatrix} \sim \mathcal{N}\left( \begin{bmatrix} m \\ m^* \end{bmatrix}, \begin{bmatrix} K + \sigma_n^2 I & K_* \\ K_*^T & k_{**} \end{bmatrix} \right)[yf∗]∼N([mm∗],[K+σn2IK∗TK∗k∗∗])
推导:
- 均值:E[y]=m\mathbb{E}[y] = mE[y]=m,E[f∗]=m∗\mathbb{E}[f^*] = m^*E[f∗]=m∗(不变);
- 协方差:Cov(y,f∗)=Cov(f+ϵ,f∗)=Cov(f,f∗)=K∗\text{Cov}(y, f^*) = \text{Cov}(f + \epsilon, f^*) = \text{Cov}(f, f^*) = K_*Cov(y,f∗)=Cov(f+ϵ,f∗)=Cov(f,f∗)=K∗(ϵ\epsilonϵ与f∗f^*f∗独立,协方差为0);
- Var(y)=K+σn2I\text{Var}(y) = K + \sigma_n^2 IVar(y)=K+σn2I(已推导),Var(f∗)=k∗∗\text{Var}(f^*) = k_{**}Var(f∗)=k∗∗(不变)。
步骤2:求f^*的条件分布(用条件高斯公式)
根据2.3节的条件高斯公式,将yyy视为“观测变量”(对应z2z_2z2),f∗f^*f∗视为“待预测变量”(对应z1z_1z1),则:
f∗∣D,x∗∼N(μ∗,Var∗) f^* | \mathcal{D}, x^* \sim \mathcal{N}\left( \mu^*, \text{Var}^* \right)f∗∣D,x∗∼N(μ∗,Var∗)
其中:
- 预测均值(后验均值):μ∗=m∗+K∗T(K+σn2I)−1(y−m)\mu^* = m^* + K_*^T \left( K + \sigma_n^2 I \right)^{-1} (y - m)μ∗=m∗+K∗T(K+σn2I)−1(y−m)(用训练数据yyy修正预测点的先验均值m∗m^*m∗);
- 预测方差(后验方差):Var∗=k∗∗−K∗T(K+σn2I)−1K∗\text{Var}^* = k_{**} - K_*^T \left( K + \sigma_n^2 I \right)^{-1} K_*Var∗=k∗∗−K∗T(K+σn2I)−1K∗(观测训练数据后,f^*的不确定性降低)。
步骤3:求y^*的分布(带噪声)
由于y∗=f∗+ϵ∗y^* = f^* + \epsilon^*y∗=f∗+ϵ∗(ϵ∗∼N(0,σn2)\epsilon^* \sim \mathcal{N}(0, \sigma_n^2)ϵ∗∼N(0,σn2),与ϵi\epsilon_iϵi独立),因此y∗y^*y∗的分布是f∗f^*f∗的分布加噪声:
y∗∣D,x∗∼N(μ∗,Var∗+σn2) y^* | \mathcal{D}, x^* \sim \mathcal{N}\left( \mu^*, \text{Var}^* + \sigma_n^2 \right)y∗∣D,x∗∼N(μ∗,Var∗+σn2)
推导:
- 均值:E[y∗]=E[f∗]+E[ϵ∗]=μ∗\mathbb{E}[y^*] = \mathbb{E}[f^*] + \mathbb{E}[\epsilon^*] = \mu^*E[y∗]=E[f∗]+E[ϵ∗]=μ∗(噪声均值为0);
- 方差:Var(y∗)=Var(f∗)+Var(ϵ∗)=Var∗+σn2\text{Var}(y^*) = \text{Var}(f^*) + \text{Var}(\epsilon^*) = \text{Var}^* + \sigma_n^2Var(y∗)=Var(f∗)+Var(ϵ∗)=Var∗+σn2(独立变量方差相加)。
4.5 简化:零均值假设
通常,我们会假设先验均值函数m(x)=0m(x) = 0m(x)=0(理由:核函数已能捕捉函数的主要形状,且数据可通过中心化消除均值偏移)。此时,预测公式简化为:
- 预测均值:μ∗=K∗T(K+σn2I)−1y\mu^* = K_*^T \left( K + \sigma_n^2 I \right)^{-1} yμ∗=K∗T(K+σn2I)−1y;
- 预测方差:Var∗=k∗∗−K∗T(K+σn2I)−1K∗\text{Var}^* = k_{**} - K_*^T \left( K + \sigma_n^2 I \right)^{-1} K_*Var∗=k∗∗−K∗T(K+σn2I)−1K∗;
- y^*的分布:N(μ∗,Var∗+σn2)\mathcal{N}(\mu^*, \text{Var}^* + \sigma_n^2)N(μ∗,Var∗+σn2)。
4.6 直观解释
- 预测均值μ∗\mu^*μ∗:可视为“训练数据的加权平均”,权重由核函数决定——离x∗x^*x∗越近的训练点,权重越高(因为K∗K_*K∗中的元素越大);
- 预测方差Var∗\text{Var}^*Var∗:反映预测的不确定性——当x∗x^*x∗离训练数据越远,K∗K_*K∗中的元素越小,Var∗\text{Var}^*Var∗越大(不确定性越高);当x∗x^*x∗与某训练点重合时,Var∗=k∗∗−k∗∗=0\text{Var}^* = k_{**} - k_{**} = 0Var∗=k∗∗−k∗∗=0(但加上噪声后Var∗+σn2=σn2\text{Var}^* + \sigma_n^2 = \sigma_n^2Var∗+σn2=σn2,符合观测噪声的假设)。
5. 高斯过程回归的完整求解步骤
现在将推导转化为可操作的步骤,小白可按此流程实现GPR(无需代码,理解逻辑即可):
步骤1:数据准备
- 输入:训练数据D={(xi,yi)}i=1n\mathcal{D} = \{(x_i, y_i)\}_{i=1}^nD={(xi,yi)}i=1n,测试点x∗x^*x∗;
- 预处理:对输入xix_ixi和输出yiy_iyi进行标准化(均值0、方差1),避免核函数的超参数因尺度差异难以优化。
步骤2:选择先验函数
- 均值函数:通常选m(x)=0m(x) = 0m(x)=0(简化问题);
- 协方差函数:根据数据特性选择(如光滑数据选SE核,周期性数据选周期核)。
步骤3:计算核心矩阵/向量
根据选择的核函数,计算:
- 训练点协方差矩阵KKK(n×nn \times nn×n,Kij=k(xi,xj)K_{ij} = k(x_i, x_j)Kij=k(xi,xj));
- 训练点-预测点协方差向量K∗K_*K∗(n×1n \times 1n×1,KaTeX parse error: Double subscript at position 4: K_*_̲i = k(x_i, x^*));
- 预测点自协方差k∗∗k_{**}k∗∗(k∗∗=k(x∗,x∗)k_{**} = k(x^*, x^*)k∗∗=k(x∗,x∗))。
步骤4:计算预测分布(初始)
用零均值假设下的公式计算:
- 预测均值μ∗=K∗T(K+σn2I)−1y\mu^* = K_*^T (K + \sigma_n^2 I)^{-1} yμ∗=K∗T(K+σn2I)−1y;
- 预测方差Var∗=k∗∗−K∗T(K+σn2I)−1K∗\text{Var}^* = k_{**} - K_*^T (K + \sigma_n^2 I)^{-1} K_*Var∗=k∗∗−K∗T(K+σn2I)−1K∗;
- y^*的分布:N(μ∗,Var∗+σn2)\mathcal{N}(\mu^*, \text{Var}^* + \sigma_n^2)N(μ∗,Var∗+σn2)。
步骤5:超参数优化(关键!)
核函数和噪声的参数(如SE核的σf2,l\sigma_f^2, lσf2,l,噪声方差σn2\sigma_n^2σn2)称为超参数,需通过**极大似然估计(MLE)**优化。
(1)边际似然函数
超参数θ\thetaθ(如θ=[σf2,l,σn2]\theta = [\sigma_f^2, l, \sigma_n^2]θ=[σf2,l,σn2])的优化目标是最大化边际似然p(y∣X,θ)p(y | X, \theta)p(y∣X,θ)(积分掉隐变量f后的似然,即“观测数据y在超参数θ\thetaθ下的概率”)。
根据y的分布y∼N(0,K+σn2I)y \sim \mathcal{N}(0, K + \sigma_n^2 I)y∼N(0,K+σn2I)(零均值假设),边际似然的对数形式(更易计算)为:
logp(y∣X,θ)=−12yT(K+σn2I)−1y−12log∣K+σn2I∣−n2log(2π) \log p(y | X, \theta) = -\frac{1}{2} y^T (K + \sigma_n^2 I)^{-1} y - \frac{1}{2} \log |K + \sigma_n^2 I| - \frac{n}{2} \log(2\pi)logp(y∣X,θ)=−21yT(K+σn2I)−1y−21log∣K+σn2I∣−2nlog(2π)
项解释:
- 第一项:拟合度(y与模型预测的偏差,越小越好);
- 第二项:模型复杂度(协方差矩阵的行列式,越大表示模型越复杂,需惩罚);
- 第三项:常数项(不影响优化)。
(2)优化方法
超参数θ\thetaθ的优化是非线性无约束优化(边际似然函数非凸),常用方法:
- 梯度下降(需计算边际似然对θ\thetaθ的梯度);
- L-BFGS(拟牛顿法,适合中小规模数据);
- 贝叶斯优化(针对黑箱函数,适合超参数多的情况)。
步骤6:最终预测
用优化后的超参数θ∗\theta^*θ∗重新计算K,K∗,k∗∗K, K_*, k_{**}K,K∗,k∗∗,再用步骤4的公式得到最终预测分布:
- 点估计:取预测均值μ∗\mu^*μ∗(对应“最可能的输出”);
- 不确定性:用预测方差Var∗+σn2\text{Var}^* + \sigma_n^2Var∗+σn2(如95%置信区间为μ∗±1.96Var∗+σn2\mu^* \pm 1.96\sqrt{\text{Var}^* + \sigma_n^2}μ∗±1.96Var∗+σn2)。
6. 高斯过程回归的适用边界与局限性
GPR是强大的工具,但并非万能,需明确其适用场景和局限性:
6.1 适用场景
- 需要不确定性估计:如医疗诊断(预测病情的风险)、金融(预测股票收益的波动)、机器人学(路径规划中的避障);
- 非线性小样本数据:GPR的计算复杂度为O(n3)O(n^3)O(n3)(协方差矩阵的逆),小样本(n<1000n < 1000n<1000)时高效,且能拟合非线性关系;
- 光滑函数拟合:SE核等光滑核适合拟合连续、光滑的曲线;
- 先验知识融入:通过选择核函数(如周期核)或调整超参数,可将领域知识(如“数据有周期性”)融入模型。
6.2 局限性
- 计算复杂度高:当n>1000n > 1000n>1000时,O(n3)O(n^3)O(n3)的时间复杂度和O(n2)O(n^2)O(n2)的空间复杂度会导致计算崩溃(需用稀疏GP、变分GP等近似方法);
- 高维输入困境:当输入维度d>20d > 20d>20时,“维度灾难”会导致核函数的长度尺度参数失效(输入空间的距离变得无意义),需用ARD核或降维(如PCA);
- 核函数选择敏感:GPR的性能高度依赖核函数的选择,若核函数与数据特性不匹配(如用SE核拟合阶跃数据),模型会严重欠拟合;
- 非平稳数据挑战:SE核等平稳核(仅依赖输入差x−x′x - x'x−x′)无法处理非平稳数据(如趋势性数据),需用非平稳核(如多项式核)。
7. 示例:用GPR拟合正弦曲线
为帮助理解,我们用GPR拟合一个简单的正弦曲线:
(1)数据生成
- 真实函数:f(x)=sin(x)f(x) = \sin(x)f(x)=sin(x)(x∈[0,4π]x \in [0, 4\pi]x∈[0,4π]);
- 训练数据:随机选5个点,添加噪声yi=sin(xi)+0.1ϵiy_i = \sin(x_i) + 0.1\epsilon_iyi=sin(xi)+0.1ϵi(ϵi∼N(0,1)\epsilon_i \sim \mathcal{N}(0,1)ϵi∼N(0,1));
- 核函数:SE核k(x,x′)=1⋅exp(−(x−x′)22⋅12)k(x,x') = 1 \cdot \exp(-\frac{(x-x')^2}{2 \cdot 1^2})k(x,x′)=1⋅exp(−2⋅12(x−x′)2)(σf2=1\sigma_f^2=1σf2=1,l=1l=1l=1);
- 噪声方差:σn2=0.01\sigma_n^2 = 0.01σn2=0.01。
(2)预测结果
- 均值曲线:μ∗(x)\mu^*(x)μ∗(x)会贴合训练数据,且在训练点附近与sin(x)\sin(x)sin(x)几乎重合;
- 置信区间:在训练点附近,方差小(置信区间窄);在训练点之间或远离训练数据的区域,方差大(置信区间宽);
- 不确定性直观:当xxx接近4π4\pi4π(训练数据未覆盖的区域),方差急剧增大,说明模型对未观测区域的预测不确定性高。
8. 总结
高斯过程回归是概率性、非参数、非线性的回归方法,核心是用高斯分布描述函数的不确定性,通过条件高斯分布实现预测。其优势在于:
- 自然输出不确定性估计;
- 无需手动设计特征;
- 结合先验知识灵活。
小白入门的关键是:
- 掌握高斯分布的“联合-条件”变换;
- 理解均值函数和核函数的作用;
- 记住预测分布的推导逻辑;
- 明确超参数优化的重要性。
若想深入,可进一步学习:
- 稀疏高斯过程(处理大数据);
- 变分高斯过程(近似推断);
- 深度高斯过程(结合神经网络)。
希望本教程能帮助小白迈出GPR的第一步!
案例介绍
模拟温度随时间变化数据:输入为时间点(0到1小时,间隔0.05小时),输出为带噪声的正弦曲线模拟温度值(真实温度为sin(2πx),添加方差为0.01的高斯噪声)。使用高斯过程回归拟合数据,并输出预测值与95%置信区间。
Python代码
importnumpyasnpimportmatplotlib.pyplotaspltfromscipy.linalgimportinv# 导入矩阵求逆函数# 自定义RBF协方差函数defrbf_cov(x1,x2,sigma_f=1.0,l=0.1):""" RBF(平方指数)协方差函数 参数: x1: 输入向量1,形状为(n, 1) x2: 输入向量2,形状为(m, 1) sigma_f: 振幅参数,控制函数波动范围 l: 长度尺度,控制函数光滑度 返回: 协方差矩阵,形状为(n, m) """# 计算欧氏距离的平方dist_sq=np.sum(x1**2,1).reshape(-1,1)+np.sum(x2**2,1)-2*np.dot(x1,x2.T)# RBF协方差函数公式returnsigma_f**2*np.exp(-0.5*dist_sq/l**2)# 高斯过程回归预测函数defgp_regression(x_train,y_train,x_test,sigma_f=1.0,l=0.1,sigma_n=0.1):""" 高斯过程回归预测 参数: x_train: 训练输入数据,形状为(n, 1) y_train: 训练输出数据,形状为(n, 1) x_test: 测试输入数据,形状为(m, 1) sigma_f: RBF协方差函数的振幅参数 l: RBF协方差函数的长度尺度 sigma_n: 观测噪声的标准差 返回: mu: 测试输出的后验均值,形状为(m, 1) sigma: 测试输出的后验标准差,形状为(m, 1) """# 计算训练数据的协方差矩阵KK=rbf_cov(x_train,x_train,sigma_f,l)# 加入观测噪声的协方差矩阵K_noiseK_noise=K+sigma_n**2*np.eye(len(x_train))# 计算训练与测试数据的协方差矩阵K_*K_star=rbf_cov(x_train,x_test,sigma_f,l)# 计算测试数据的协方差矩阵K_**K_star_star=rbf_cov(x_test,x_test,sigma_f,l)# 计算后验均值mu# 步骤: K_* 乘以 K_noise的逆 乘以 y_trainmu=np.dot(np.dot(K_star.T,inv(K_noise)),y_train)# 计算后验协方差Sigma# 步骤: K_** 减去 K_* 乘以 K_noise的逆 乘以 K_*的转置Sigma=K_star_star-np.dot(np.dot(K_star.T,inv(K_noise)),K_star)# 提取对角线元素得到每个测试点的方差,再开方得到标准差sigma=np.sqrt(np.diag(Sigma)).reshape(-1,1)returnmu,sigma# 主程序if__name__=="__main__":# 1. 生成模拟数据# 训练数据: 生成20个随机时间点(0到1小时)np.random.seed(42)# 设置随机种子以确保结果可复现x_train=np.random.rand(20,1)# 20个训练输入点,形状(20,1)# 真实温度为sin(2πx),添加方差0.01的高斯噪声y_train=np.sin(2*np.pi*x_train)+0.1*np.random.randn(20,1)# 测试数据: 生成100个均匀分布的时间点(0到1小时,间隔0.01)x_test=np.linspace(0,1,100).reshape(-1,1)# 形状(100,1)# 2. 进行高斯过程回归预测# 设置超参数: sigma_f=1.0, l=0.1, sigma_n=0.1mu_pred,sigma_pred=gp_regression(x_train,y_train,x_test,sigma_f=1.0,l=0.1,sigma_n=0.1)# 3. 可视化结果plt.figure(figsize=(10,6))# 绘制训练数据点plt.scatter(x_train,y_train,label="Training Data",color="red")# 绘制预测均值曲线plt.plot(x_test,mu_pred,label="GP Prediction Mean",color="blue",linewidth=2)# 绘制95%置信区间(均值±2倍标准差)plt.fill_between(x_test.flatten(),(mu_pred-2*sigma_pred).flatten(),(mu_pred+2*sigma_pred).flatten(),alpha=0.3,label="95% Confidence Interval",color="lightblue")# 添加标题和坐标轴标签plt.title("Gaussian Process Regression - Temperature Prediction")plt.xlabel("Time (hour)")plt.ylabel("Temperature (°C)")# 显示图例plt.legend()# 显示网格线plt.grid(True)# 保存或显示图像plt.savefig("gp_regression_temperature.png")plt.show()代码深度解析:高斯过程回归(GP)温度预测
一、代码整体框架与数学背景
这段代码实现了高斯过程回归(Gaussian Process Regression, GPR)在模拟温度数据上的应用。高斯过程是一种强大的非参数回归方法,核心是通过核函数(协方差函数)捕捉数据的相关性,并给出预测值及其不确定性区间。
二、模块导入与功能说明
importnumpyasnpimportmatplotlib.pyplotaspltfromscipy.linalgimportinv# 导入矩阵求逆函数numpy:用于数值计算(矩阵运算、随机数生成)matplotlib:用于结果可视化scipy.linalg.inv:用于计算矩阵逆(GP后验推导的核心运算)
三、RBF(平方指数)协方差函数实现
数学背景:RBF核是最常用的协方差函数,用于描述“越近的点相关性越强”的光滑过程,公式为:k(x1,x2)=σf2exp(−∣∣x1−x2∣∣22l2) k(x_1, x_2) = \sigma_f^2 \exp\left( -\frac{||x_1 - x_2||^2}{2l^2} \right)k(x1,x2)=σf2exp(−2l2∣∣x1−x2∣∣2)其中,σf\sigma_fσf为振幅(控制函数波动范围),lll为长度尺度(控制函数光滑度:lll越小,函数越“崎岖”;lll越大,函数越“平滑”)。
defrbf_cov(x1,x2,sigma_f=1.0,l=0.1):""" RBF(平方指数)协方差函数 参数: x1: 输入向量1,形状为(n, 1) x2: 输入向量2,形状为(m, 1) sigma_f: 振幅参数,控制函数波动范围 l: 长度尺度,控制函数光滑度 返回: 协方差矩阵,形状为(n, m) """# 计算欧氏距离的平方(广播技巧优化)dist_sq=np.sum(x1**2,1).reshape(-1,1)+np.sum(x2**2,1)-2*np.dot(x1,x2.T)# RBF协方差函数公式实现returnsigma_f**2*np.exp(-0.5*dist_sq/l**2)关键代码解析:
欧氏距离平方的计算:利用矩阵运算和广播优化效率,避免双重循环。公式推导:∣∣x1[i]−x2[j]∣∣2=∣∣x1[i]∣∣2+∣∣x2[j]∣∣2−2x1[i]Tx2[j] ||x1[i] - x2[j]||^2 = ||x1[i]||^2 + ||x2[j]||^2 - 2x1[i]^T x2[j]∣∣x1[i]−x2[j]∣∣2=∣∣x1[i]∣∣2+∣∣x2[j]∣∣2−2x1[i]Tx2[j]
np.sum(x1**2, 1).reshape(-1, 1):计算x1每个样本的平方和,结果为(n, 1)的列向量np.sum(x2**2, 1):计算x2每个样本的平方和,结果为(1, m)的行向量2 * np.dot(x1, x2.T):计算x1与x2的内积矩阵,形状为(n, m)三者通过广播相加,最终得到所有样本对的欧氏距离平方矩阵dist_sq(形状(n, m))。
RBF核值计算:将
dist_sq代入RBF公式,返回(n, m)的协方差矩阵,描述x1和x2的样本间相关性。
四、高斯过程回归预测函数
数学背景:GP回归的核心是求解后验分布。给定训练数据(xtrain,ytrain)(x_{\text{train}}, y_{\text{train}})(xtrain,ytrain),测试数据xtestx_{\text{test}}xtest的后验分布为:fpost(xtest)∼N(μpost,Σpost) f_{\text{post}}(x_{\text{test}}) \sim \mathcal{N}( \mu_{\text{post}}, \Sigma_{\text{post}} )fpost(xtest)∼N(μpost,Σpost)其中:
- 后验均值:μpost=K∗T(K+σn2I)−1ytrain\mu_{\text{post}} = K_{*}^T (K + \sigma_n^2 I)^{-1} y_{\text{train}}μpost=K∗T(K+σn2I)−1ytrain
- 后验协方差:Σpost=K∗∗−K∗T(K+σn2I)−1K∗\Sigma_{\text{post}} = K_{**} - K_{*}^T (K + \sigma_n^2 I)^{-1} K_{*}Σpost=K∗∗−K∗T(K+σn2I)−1K∗
参数说明:
- K=k(xtrain,xtrain)K = k(x_{\text{train}}, x_{\text{train}})K=k(xtrain,xtrain):训练数据的协方差矩阵
- K∗=k(xtrain,xtest)K_{*} = k(x_{\text{train}}, x_{\text{test}})K∗=k(xtrain,xtest):训练与测试数据的协方差矩阵
- K∗∗=k(xtest,xtest)K_{**} = k(x_{\text{test}}, x_{\text{test}})K∗∗=k(xtest,xtest):测试数据的协方差矩阵
- σn2I\sigma_n^2 Iσn2I:观测噪声的协方差矩阵(假设噪声服从N(0,σn2)\mathcal{N}(0, \sigma_n^2)N(0,σn2))
defgp_regression(x_train,y_train,x_test,sigma_f=1.0,l=0.1,sigma_n=0.1):""" 高斯过程回归预测 参数: x_train: 训练输入数据,形状为(n, 1) y_train: 训练输出数据,形状为(n, 1) x_test: 测试输入数据,形状为(m, 1) sigma_f: RBF协方差函数的振幅参数 l: RBF协方差函数的长度尺度 sigma_n: 观测噪声的标准差 返回: mu: 测试输出的后验均值,形状为(m, 1) sigma: 测试输出的后验标准差,形状为(m, 1) """# 计算训练数据的协方差矩阵KK=rbf_cov(x_train,x_train,sigma_f,l)# 加入观测噪声的协方差矩阵K_noise(K + σₙ²I)K_noise=K+sigma_n**2*np.eye(len(x_train))# 计算训练与测试数据的协方差矩阵K_*K_star=rbf_cov(x_train,x_test,sigma_f,l)# 计算测试数据的协方差矩阵K_**K_star_star=rbf_cov(x_test,x_test,sigma_f,l)# 计算后验均值mumu=np.dot(np.dot(K_star.T,inv(K_noise)),y_train)# 计算后验协方差SigmaSigma=K_star_star-np.dot(np.dot(K_star.T,inv(K_noise)),K_star)# 提取对角线元素得到每个测试点的方差,开方为标准差sigma=np.sqrt(np.diag(Sigma)).reshape(-1,1)returnmu,sigma关键代码解析:
协方差矩阵计算:
K:训练数据的自协方差矩阵(n×n)K_noise:加入噪声后的协方差矩阵(n×n),确保矩阵可逆K_star:训练与测试的交叉协方差矩阵(n×m)K_star_star:测试数据的自协方差矩阵(m×m)
后验均值与协方差计算:
- 后验均值:通过矩阵乘法直接实现数学公式,
inv(K_noise)为噪声协方差矩阵的逆 - 后验协方差:
Sigma是(m×m)矩阵,描述测试样本间的相关性 - 标准差:提取
Sigma的对角线元素(单个测试点的方差),开方后得到每个测试点的预测不确定性。
- 后验均值:通过矩阵乘法直接实现数学公式,
五、主程序:数据生成、预测与可视化
if__name__=="__main__":# 1. 生成模拟数据np.random.seed(42)# 设置随机种子,确保结果可复现x_train=np.random.rand(20,1)# 20个随机训练输入点(0~1小时),形状(20,1)y_train=np.sin(2*np.pi*x_train)+0.1*np.random.randn(20,1)# 带噪声的正弦曲线(真实温度+高斯噪声)# 2. 生成测试数据(100个均匀分布的时间点,0~1小时,间隔0.01)x_test=np.linspace(0,1,100).reshape(-1,1)# 形状(100,1)# 3. 进行高斯过程回归预测mu_pred,sigma_pred=gp_regression(x_train,y_train,x_test,sigma_f=1.0,l=0.1,sigma_n=0.1)# 4. 可视化结果plt.figure(figsize=(10,6))plt.scatter(x_train,y_train,label="Training Data",color="red")# 训练数据点plt.plot(x_test,mu_pred,label="GP Prediction Mean",color="blue",linewidth=2)# 预测均值曲线# 绘制95%置信区间(均值±2倍标准差,高斯分布的95%置信范围)plt.fill_between(x_test.flatten(),(mu_pred-2*sigma_pred).flatten(),(mu_pred+2*sigma_pred).flatten(),alpha=0.3,label="95% Confidence Interval",color="lightblue")# 图表装饰plt.title("Gaussian Process Regression - Temperature Prediction")plt.xlabel("Time (hour)")plt.ylabel("Temperature (°C)")plt.legend()plt.grid(True)plt.savefig("gp_regression_temperature.png")# 保存图像plt.show()# 显示图像关键代码解析:
模拟数据生成:
np.random.rand(20, 1):生成20个0~1之间的随机训练时间点np.sin(2*np.pi*x_train):真实温度曲线(周期为1小时的正弦曲线)0.1*np.random.randn(20,1):添加方差为0.01的高斯噪声(因为randn的标准差为1,乘以0.1后标准差为0.1,方差=0.1²=0.01)
测试数据生成:
np.linspace(0, 1, 100):生成100个均匀分布的测试时间点,覆盖0~1小时的完整范围,用于绘制连续的预测曲线。
可视化:
plt.scatter:绘制训练数据点(红色)plt.plot:绘制GP预测的均值曲线(蓝色)plt.fill_between:绘制95%置信区间(均值±2σ,α=0.3表示半透明),反映预测的不确定性:- 靠近训练数据的区域,置信区间窄(不确定性小)
- 远离训练数据的区域,置信区间宽(不确定性大)
六、数学建模思考
- 核函数选择:RBF核适合平滑过程(如温度随时间的连续变化),若数据有周期性可考虑周期性核(如Exponential Sinusoidal Kernel)。
- 超参数优化:代码中
sigma_f、l、sigma_n是手动设置的,实际建模中应通过极大似然估计或交叉验证优化,以提升预测精度。 - 结果解读:GP的优势在于同时给出预测值和不确定性估计,这对数学建模中的“风险评估”(如预测温度异常的置信度)非常重要。
通过以上解析,结合数学公式与代码实现的对应关系,可清晰理解高斯过程回归的核心逻辑及代码细节。