高斯过程(Gaussian Process, GP)是一种强大的统计模型,用于对数据中的不确定性进行建模,特别是在机器学习和统计推断领域。高斯过程常用于回归(预测连续输出)和分类任务,提供了一种优雅的方式来预测及量化预测的不确定性。
文章目录
简介
高斯过程通常表示为 G P ( m , k ) GP(m, k) GP(m,k),其中 m m m 是均值函数,通常可以是零(或任何其他常数), k k k 是协方差函数,也称为核函数。当提到 G P ( 0 , 1 ) GP(0, 1) GP(0,1) 时,通常指的是具有零均值和单位方差的简化高斯过程。
具体公式
对于 G P ( 0 , 1 ) GP(0, 1) GP(0,1),假设一个随机函数 f ( x ) f(x) f(x) 满足高斯过程,其均值函数 m ( x ) = 0 m(x) = 0 m(x)=0(对所有 x x x 都是零),协方差函数 k ( x , x ′ ) = δ ( x , x ′ ) k(x, x') = \delta(x, x') k(x,x′)=δ(x,x′),其中 δ \delta δ 是狄拉克δ函数。这表示任意两点 x x x 和 x ′ x' x′ 的函数值 f ( x ) f(x) f(x) 和 f ( x ′ ) f(x') f(x′) 是独立且标准正态分布的,如果 x = x ′ x = x' x=x′,则完全相关(协方差为1),如果 x ≠ x ′ x \neq x' x=x′,则无关(协方差为0)。
数学表达
公式可以表达为:
f
(
x
)
∼
N
(
0
,
1
)
f(x) \sim \mathcal{N}(0, 1)
f(x)∼N(0,1)
对于任何有限集合的点
x
1
,
x
2
,
…
,
x
n
x_1, x_2, \ldots, x_n
x1,x2,…,xn,
f
f
f 在这些点的值形成的向量
f
=
(
f
(
x
1
)
,
f
(
x
2
)
,
…
,
f
(
x
n
)
)
T
\mathbf{f} = (f(x_1), f(x_2), \ldots, f(x_n))^T
f=(f(x1),f(x2),…,f(xn))T 也遵循多元正态分布:
f
∼
N
(
0
,
I
)
\mathbf{f} \sim \mathcal{N}(\mathbf{0}, \mathbf{I})
f∼N(0,I)
其中,
0
\mathbf{0}
0 是一个
n
n
n 维的零向量,
I
\mathbf{I}
I 是
n
×
n
n \times n
n×n 的单位矩阵,表示这些点的函数值互相独立。
这种形式的高斯过程因为其简化的性质,在实际应用中比较少见,通常会选择更复杂的协方差函数来捕捉数据点之间的相关性。
高斯过程的基本概念
1. 高斯分布(正态分布)
高斯过程的基础是高斯分布,即正态分布。这是一种对称的钟形曲线分布,由两个参数控制:均值(mean)和方差(variance)。均值确定了分布的中心位置,方差确定了分布的宽度,即数据的分散程度。
2. 从高斯分布到高斯过程
高斯过程描述的是函数的分布,而不仅是实数的分布。如果你认为一个函数的每个点的值都来自某个高斯分布,并且每一对点之间的值都有某种确定的相关性,那么你就可以用高斯过程来描述这个函数。高斯过程本质上是无限维的高斯分布,每个维度对应函数的一个可能的值。
3. 核函数(Covariance Function)
核函数在高斯过程中定义点与点之间的相关性。它描述了一个点处的函数值如何影响其他点处的函数值。常见的核函数包括平方指数核、线性核和周期核等。选择不同的核函数可以捕捉数据的不同特性,如平滑度、周期性等。
高斯过程的应用
1. 高斯过程回归(Gaussian Process Regression)
在高斯过程回归中,我们使用高斯过程来预测给定输入点的输出值。具体步骤如下:
- 选择一个核函数,这决定了你认为数据中的关系是怎样的。
- 给定训练数据(已知的输入-输出对),基于核函数计算训练点之间的协方差矩阵。
- 预测新点的输出,通过计算新点与训练数据点之间的协方差,并利用这些协方差更新你对新点输出的预测及其不确定性。
2. 量化预测的不确定性
高斯过程的一个关键优势是能够提供预测的不确定性估计。对于每一个预测点,高斯过程不仅给出预测值(即均值),还提供了预测的方差,这个方差可以被解释为该预测的不确定性。
高斯过程回归
高斯过程回归(Gaussian Process Regression, GPR)是一种基于概率的回归方法,使用高斯过程来预测未知数据点的输出。在深入数学公式之前,我们先建立一些概率论的基础知识。
概率论基础
-
高斯分布(正态分布):
- 单变量高斯分布的概率密度函数为:
p
(
x
)
=
1
2
π
σ
2
exp
(
−
(
x
−
μ
)
2
2
σ
2
)
p(x) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
p(x)=2πσ21exp(−2σ2(x−μ)2)
其中, μ \mu μ 是均值, σ 2 \sigma^2 σ2 是方差。
- 单变量高斯分布的概率密度函数为:
p
(
x
)
=
1
2
π
σ
2
exp
(
−
(
x
−
μ
)
2
2
σ
2
)
p(x) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
p(x)=2πσ21exp(−2σ2(x−μ)2)
-
多变量高斯分布:
-
x
∈
R
n
\mathbf{x} \in \mathbb{R}^n
x∈Rn 为随机向量,其服从多变量高斯分布:
x
∼
N
(
μ
,
Σ
)
\mathbf{x} \sim \mathcal{N}(\boldsymbol{\mu}, \Sigma)
x∼N(μ,Σ)
其中, μ \boldsymbol{\mu} μ 是均值向量, Σ \Sigma Σ 是协方川矩阵。
-
x
∈
R
n
\mathbf{x} \in \mathbb{R}^n
x∈Rn 为随机向量,其服从多变量高斯分布:
x
∼
N
(
μ
,
Σ
)
\mathbf{x} \sim \mathcal{N}(\boldsymbol{\mu}, \Sigma)
x∼N(μ,Σ)
-
条件概率和边际概率:
- 条件概率:给定事件 B B B 发生的条件下,事件 A A A 发生的概率,表示为 P ( A ∣ B ) P(A|B) P(A∣B)。
- 边际概率:不考虑其他变量影响下,某个事件发生的概率。
高斯过程回归的数学描述
高斯过程是定义在连续输入空间的随机过程,其中任何一组点的联合分布都是高斯的。
高斯过程定义
假设我们有一个函数
f
(
x
)
f(x)
f(x) 从输入空间
X
\mathcal{X}
X 映射到实数
R
\mathbb{R}
R。如果对于任意选择的点集 KaTeX parse error: Unexpected end of input in a macro argument, expected '}' at end of input: … \in \mathcal{X,这些点对应的函数值
f
(
x
1
)
,
…
,
f
(
x
n
)
f(x_1), \ldots, f(x_n)
f(x1),…,f(xn) 总是服从多元高斯分布,则
f
f
f 可以表示为一个高斯过程:
f
(
x
)
∼
GP
(
m
(
x
)
,
k
(
x
,
x
′
)
)
f(x) \sim \text{GP}(m(x), k(x, x'))
f(x)∼GP(m(x),k(x,x′))
其中,
m
(
x
)
m(x)
m(x) 是均值函数,
k
(
x
,
x
′
)
k(x, x')
k(x,x′) 是协方差函数,它表达了任何两点
x
x
x 和
x
′
x'
x′ 之间的相关性。
高斯过程回归的公式
假设我们有训练数据集 { ( x i , y i ) } i = 1 n \{(x_i, y_i)\}_{i=1}^n {(xi,yi)}i=1n,其中 y i = f ( x i ) + ϵ i y_i = f(x_i) + \epsilon_i yi=f(xi)+ϵi, ϵ i ∼ N ( 0 , σ 2 ) \epsilon_i \sim \mathcal{N}(0, \sigma^2) ϵi∼N(0,σ2) 表示噪声。我们希望预测新的输入点 x ∗ x_* x∗ 对应的输出 f ( x ∗ ) f(x_*) f(x∗)。
-
先验分布:
f ∼ GP ( m ( x ) , k ( x , x ′ ) ) f \sim \text{GP}(m(x), k(x, x')) f∼GP(m(x),k(x,x′))
在训练点上的函数值 f \mathbf{f} f 服从多元高斯分布: f ∼ N ( m , K ) \mathbf{f} \sim \mathcal{N}(\mathbf{m}, \mathbf{K}) f∼N(m,K)
其中, m \mathbf{m} m 是均值向量, K \mathbf{K} K 是根据协方差函数计算的协方差矩阵。 -
预测分布:
考虑新的测试点 x ∗ x_* x∗,联合分布为: [ f f ( x ∗ ) ] ∼ N ( [ m m ( x ∗ ) ] , [ K k ∗ k ∗ T k ( x ∗ , x ∗ ) ] ) \begin{bmatrix}\mathbf{f} \\ f(x_*)\end{bmatrix} \sim \mathcal{N}\left(\begin{bmatrix}\mathbf{m} \\ m(x_*)\end{bmatrix}, \begin{bmatrix}\mathbf{K} & \mathbf{k}_* \\ \mathbf{k}_*^T & k(x_*, x_*)\end{bmatrix}\right) [ff(x∗)]∼N([mm(x∗)],[Kk∗Tk∗k(x∗,x∗)])
其中, k ∗ \mathbf{k}_* k∗ 是测试点与训练点之间的协方差向量。
使用条件概率公式,可以得到预测分布:
f
(
x
∗
)
∣
y
,
X
,
x
∗
∼
N
(
f
ˉ
∗
,
var
(
f
∗
)
)
f(x_*) | \mathbf{y}, \mathbf{X}, x_* \sim \mathcal{N}(\bar{f}_*, \text{var}(f_*))
f(x∗)∣y,X,x∗∼N(fˉ∗,var(f∗))
f
ˉ
∗
=
m
(
x
∗
)
+
k
∗
T
K
−
1
(
y
−
m
)
\bar{f}_* = m(x_*) + \mathbf{k}_*^T \mathbf{K}^{-1} (\mathbf{y} - \mathbf{m})
fˉ∗=m(x∗)+k∗TK−1(y−m)
var
(
f
∗
)
=
k
(
x
∗
,
x
∗
)
−
k
∗
T
K
−
1
k
∗
\text{var}(f_*) = k(x_*, x_*) - \mathbf{k}_*^T \mathbf{K}^{-1} \mathbf{k}_*
var(f∗)=k(x∗,x∗)−k∗TK−1k∗
这些公式提供了在给定训练数据和核函数的情况下,如何对新数据点的函数值进行预测以及预测不确定性的计算方法。
对于 f f f的理解
在高斯过程回归中,当我们说 f f f 时,它代表的是一个随机函数,而不是一个特定的函数。这意味着 f f f 在每个点 x x x 的取值不是固定的,而是有一定概率分布的。这一点是高斯过程与传统函数定义的主要不同。
f f f 的理解
在高斯过程中,我们认为整个函数 f f f 是由一个连续的随机过程生成的。具体来说,对于任何输入点 x x x,函数 f ( x ) f(x) f(x) 的值是随机的,并且所有这些值(对于所有可能的 x x x)共同构成了一个无限维的高斯分布——即高斯过程。所以,当我们讨论到 f f f 时,我们实际上是在讨论这个无限维度下的一个实例。
训练点上的 f f f
当我们有具体的训练数据点 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1,x2,…,xn 时,我们考虑的是在这些特定点上函数 f f f 取值的概率分布。在这些点上,函数值 f ( x 1 ) , f ( x 2 ) , … , f ( x n ) f(x_1), f(x_2), \ldots, f(x_n) f(x1),f(x2),…,f(xn) 的联合分布是多元高斯分布。这个分布的均值和协方差由高斯过程的均值函数 m ( x ) m(x) m(x) 和协方差函数 k ( x , x ′ ) k(x, x') k(x,x′) 决定。
这里的
f
=
[
f
(
x
1
)
,
f
(
x
2
)
,
…
,
f
(
x
n
)
]
T
\mathbf{f} = [f(x_1), f(x_2), \ldots, f(x_n)]^T
f=[f(x1),f(x2),…,f(xn)]T 实际上是一个随机向量,表示在训练点
x
1
,
x
2
,
…
,
x
n
x_1, x_2, \ldots, x_n
x1,x2,…,xn 上的函数值。每个元素
f
(
x
i
)
f(x_i)
f(xi) 是一个随机变量,整个向量
f
\mathbf{f}
f 遵循多元高斯分布:
f
∼
N
(
m
,
K
)
\mathbf{f} \sim \mathcal{N}(\mathbf{m}, \mathbf{K})
f∼N(m,K)
其中:
- m = [ m ( x 1 ) , m ( x 2 ) , … , m ( x n ) ] T \mathbf{m} = [m(x_1), m(x_2), \ldots, m(x_n)]^T m=[m(x1),m(x2),…,m(xn)]T 是均值向量,由均值函数 m m m 在每个训练点计算得到。
- K \mathbf{K} K 是一个 n × n n \times n n×n 的协方差矩阵,其中元素 K i j = k ( x i , x j ) \mathbf{K}_{ij} = k(x_i, x_j) Kij=k(xi,xj),由协方差函数 k k k 在所有训练点对计算得到。
因此,当我们说 f \mathbf{f} f 时,它是一个具体的,有限维的随机向量,代表在给定训练点上的函数值,这些值是相关的并且具有高斯分布特性。这是利用高斯过程进行回归和预测的基础。
高斯过程应用具体示例
好的,我们可以更详细地解析高斯过程回归中如何计算预测点与训练点之间的协方差向量 k ∗ \mathbf{k}_* k∗,以及如何使用这些计算来预测新数据点的温度。我们继续使用前述的平方指数核,并将实际的计算步骤和数值具体化。
步骤1: 定义核函数参数
我们选用的平方指数核函数参数为:
- 输出方差 σ 2 = 1 \sigma^2 = 1 σ2=1
- 长度参数 l = 2 l = 2 l=2
核函数公式为:
k
(
x
,
x
′
)
=
exp
(
−
(
x
−
x
′
)
2
2
l
2
)
k(x, x') = \exp\left(-\frac{(x - x')^2}{2l^2}\right)
k(x,x′)=exp(−2l2(x−x′)2)
步骤2: 计算训练点间的协方差矩阵 K \mathbf{K} K
训练数据点时间 x = [ 8 , 12 , 18 ] \mathbf{x} = [8, 12, 18] x=[8,12,18],训练数据点温度 y = [ 15 , 20 , 15 ] \mathbf{y} = [15, 20, 15] y=[15,20,15]。
计算 K \mathbf{K} K 的每个元素:
- K 11 = k ( 8 , 8 ) = 1 K_{11} = k(8, 8) = 1 K11=k(8,8)=1
- K 12 = k ( 8 , 12 ) = exp ( − ( 8 − 12 ) 2 8 ) = exp ( − 2 ) ≈ 0.135 K_{12} = k(8, 12) = \exp\left(-\frac{(8 - 12)^2}{8}\right) = \exp(-2) \approx 0.135 K12=k(8,12)=exp(−8(8−12)2)=exp(−2)≈0.135
- K 13 = k ( 8 , 18 ) = exp ( − ( 8 − 18 ) 2 8 ) = exp ( − 12.5 ) ≈ 0.004 K_{13} = k(8, 18) = \exp\left(-\frac{(8 - 18)^2}{8}\right) = \exp(-12.5) \approx 0.004 K13=k(8,18)=exp(−8(8−18)2)=exp(−12.5)≈0.004
- K 22 = k ( 12 , 12 ) = 1 K_{22} = k(12, 12) = 1 K22=k(12,12)=1
- K 23 = k ( 12 , 18 ) = exp ( − ( 12 − 18 ) 2 8 ) = exp ( − 4.5 ) ≈ 0.011 K_{23} = k(12, 18) = \exp\left(-\frac{(12 - 18)^2}{8}\right) = \exp(-4.5) \approx 0.011 K23=k(12,18)=exp(−8(12−18)2)=exp(−4.5)≈0.011
- K 33 = k ( 18 , 18 ) = 1 K_{33} = k(18, 18) = 1 K33=k(18,18)=1
因此,协方差矩阵
K
\mathbf{K}
K 是:
K
=
[
1
0.135
0.004
0.135
1
0.011
0.004
0.011
1
]
\mathbf{K} = \begin{bmatrix} 1 & 0.135 & 0.004 \\ 0.135 & 1 & 0.011 \\ 0.004 & 0.011 & 1 \end{bmatrix}
K=
10.1350.0040.13510.0110.0040.0111
步骤3: 计算训练点与预测点之间的协方差向量 k ∗ \mathbf{k}_* k∗
假设我们的预测点是 $ \mathbf{x}_* = [10, 16] $。
-
对于 10:00 的预测点:
- k ∗ ( 10 , 8 ) = exp ( − ( 10 − 8 ) 2 8 ) = exp ( − 0.5 ) ≈ 0.607 k_*(10, 8) = \exp\left(-\frac{(10 - 8)^2}{8}\right) = \exp(-0.5) \approx 0.607 k∗(10,8)=exp(−8(10−8)2)=exp(−0.5)≈0.607
- k ∗ ( 10 , 12 ) = exp ( − ( 10 − 12 ) 2 8 ) = exp ( − 0.5 ) ≈ 0.607 k_*(10, 12) = \exp\left(-\frac{(10 - 12)^2}{8}\right) = \exp(-0.5) \approx 0.607 k∗(10,12)=exp(−8(10−12)2)=exp(−0.5)≈0.607
- k ∗ ( 10 , 18 ) = exp ( − ( 10 − 18 ) 2 8 ) = exp ( − 8 ) ≈ 0.0003 k_*(10, 18) = \exp\left(-\frac{(10 - 18)^2}{8}\right) = \exp(-8) \approx 0.0003 k∗(10,18)=exp(−8(10−18)2)=exp(−8)≈0.0003
-
对于 16:00 的预测点:
- k ∗ ( 16 , 8 ) = exp ( − ( 16 − 8 ) 2 8 ) = exp ( − 8 ) ≈ 0.0003 k_*(16, 8) = \exp\left(-\frac{(16 - 8)^2}{8}\right) = \exp(-8) \approx 0.0003 k∗(16,8)=exp(−8(16−8)2)=exp(−8)≈0.0003
- k ∗ ( 16 , 12 ) = exp ( − ( 16 − 12 ) 2 8 ) = exp ( − 2 ) ≈ 0.135 k_*(16, 12) = \exp\left(-\frac{(16 - 12)^2}{8}\right) = \exp(-2) \approx 0.135 k∗(16,12)=exp(−8(16−12)2)=exp(−2)≈0.135
- k ∗ ( 16 , 18 ) = exp ( − ( 16 − 18 ) 2 8 ) = exp ( − 0.5 ) ≈ 0.607 k_*(16, 18) = \exp\left(-\frac{(16 - 18)^2}{8}\right) = \exp(-0.5) \approx 0.607 k∗(16,18)=exp(−8(16−18)2)=exp(−0.5)≈0.607
因此,协方差向量
k
∗
(
10
)
\mathbf{k}_*(10)
k∗(10) 和 $ \mathbf{k}_*(16)$ 分别是:
k
∗
(
10
)
=
[
0.607
0.607
0.0003
]
,
k
∗
(
16
)
=
[
0.0003
0.135
0.607
]
\mathbf{k}_*(10) = \begin{bmatrix} 0.607 \\ 0.607 \\ 0.0003 \end{bmatrix}, \mathbf{k}_*(16) = \begin{bmatrix} 0.0003 \\ 0.135 \\ 0.607 \end{bmatrix}
k∗(10)=
0.6070.6070.0003
,k∗(16)=
0.00030.1350.607
步骤4: 使用高斯过程公式进行预测
预测均值和方差公式已经在前面提到。现在我们可以直接将计算得到的 K \mathbf{K} K, k ∗ \mathbf{k}_* k∗ 代入以下公式来计算预测值和不确定性。这些计算通常需要用到数值计算软件或编程语言来处理矩阵的逆运算等。
-
预测公式
预测新数据点的均值和方差可以通过以下公式计算:
f ˉ ∗ = m ( x ∗ ) + k ∗ T K − 1 ( y − m ) \bar{f}_* = m(x_*) + \mathbf{k}_*^T \mathbf{K}^{-1} (\mathbf{y} - \mathbf{m}) fˉ∗=m(x∗)+k∗TK−1(y−m)
var ( f ∗ ) = k ( x ∗ , x ∗ ) − k ∗ T K − 1 k ∗ \text{var}(f_*) = k(x_*, x_*) - \mathbf{k}_*^T \mathbf{K}^{-1} \mathbf{k}_* var(f∗)=k(x∗,x∗)−k∗TK−1k∗ -
其中:
- f ˉ ∗ \bar{f}_* fˉ∗ 是预测的均值,
- var ( f ∗ ) \text{var}(f_*) var(f∗) 是预测的方差,
- m ( x ∗ ) m(x_*) m(x∗) 是在新数据点 x ∗ x_* x∗ 的均值函数值,
- k ∗ \mathbf{k}_* k∗ 是新数据点 x ∗ x_* x∗ 与训练数据点的协方差向量(可设为0),
- K \mathbf{K} K 是训练数据点间的协方差矩阵,
- y \mathbf{y} y 是训练数据点的观测值向量,
- m \mathbf{m} m 是训练数据点的均值函数值向量(可设为0)。
python案例实现
import numpy as np
# 定义核函数
def squared_exponential_kernel(x, x_prime, sigma=1, length_scale=2):
return np.exp(-(x - x_prime)**2 / (2 * length_scale**2))
# 训练数据点
x_train = np.array([8, 12, 18])
y_train = np.array([15, 20, 15])
# 构建协方差矩阵 K
K = np.array([[squared_exponential_kernel(xi, xj) for xj in x_train] for xi in x_train])
# 预测点
x_pred = np.array([10, 16])
# 计算协方差向量 k_*
k_star = np.array([[squared_exponential_kernel(x, xi) for xi in x_train] for x in x_pred])
# 计算 K 的逆
K_inv = np.linalg.inv(K)
# 计算预测的均值和方差
# 均值
mean_pred = k_star @ K_inv @ y_train
# 方差
k_star_star = np.array([squared_exponential_kernel(x, x) for x in x_pred])
var_pred = k_star_star - np.sum(k_star @ K_inv * k_star, axis=1)
mean_pred, var_pred