【参考资料】 1.B站:机器学习-白板推导系列(二十)-高斯过程GP(Gaussian Process) 2.:一文搞定(二)—— 贝叶斯线性回归 3.知乎:Gaussian process regression的导出——权重空间视角下的贝叶斯的方法 4.知乎:高斯过程 Gaussian Processes 原理、可视化及代码实现
【文章结构】 1 Introduction 简要介绍 2 Weigh-space view GPR 的权重空间角度 3 Fron wsv to fsv 从权重空间到函数空间是如何过渡的 4 Function-space view GPR 的函数空间角度 5 Example in code 包含对于一个简单 GPR 示例的 python 和 matlab 两种语言的代码
【阅读建议】 对于希望直接应用的读者可以跳过 Section 2, 3 两部分,直接看 Section 1, 4, 5
由多元高斯分布的定义可知: p ( x ) = ∏ i = 1 n p ( x i ) = 1 ( 2 π ) n 2 σ 1 . . . σ n exp ( − 1 2 [ ( x 1 − μ 1 ) 2 σ 1 2 . . . ( x n − μ n ) 2 σ 2 2 ] ) (1) \tag{1} p(\bm{x})=\prod_{i=1}^n p(x_i)=\frac{1}{(2\pi)^{\frac{n}{2}}\sigma_1...\sigma_n}\exp(-\frac{1}{2}[\frac{(x_1-\mu_1)^2}{\sigma_1^2}...\frac{(x_n-\mu_n)^2}{\sigma_2^2}]) p(x)=i=1∏np(xi)=(2π)2nσ1...σn1exp(−21[σ12(x1−μ1)2...σ22(xn−μn)2])(1) 进一步的,令 x − μ = [ x 1 − μ 1 , . . . , x n − μ n ] T , Σ = [ σ 1 2 0 . . . 0 0 σ 2 2 . . . 0 . . . . . . . . . . . . . 0 . . . 0 σ n 2 ] \bm{x-\mu}=[x_1-\mu_1,...,x_n-\mu_n]^T,\;\;\Sigma=\begin{bmatrix} \sigma_1^2 & 0 & ... & 0 \\ 0 & \sigma_2^2 & ... & 0 \\ ... & ... & ... & .... \\ 0 & ... & 0 & \sigma_n^2 \end{bmatrix} x−μ=[x1−μ1,...,xn−μn]T,Σ=⎣⎢⎢⎡σ120...00σ22...............000....σn2⎦⎥⎥⎤,从而得到式 ( 2 ) (2) (2):
p ( x ) = ( 2 π ) − n 2 ∣ Σ ∣ − 1 2 exp ( − 1 2 ( x − μ ) T ∣ Σ ∣ − 1 ( x − μ ) ) (2) \tag{2} p(\bm{x})=(2\pi)^{-\frac{n}{2}}|\Sigma|^{-\frac{1}{2}}\exp(-\frac{1}{2}(\bm{x}-\bm{\mu})^T|\Sigma|^{-1}(\bm{x}-\bm{\mu}) ) p(x)=(2π)−2n∣Σ∣−21exp(−21(x−μ)T∣Σ∣−1(x−μ))(2)
我们将式 ( 2 ) (2) (2) 称之为多元高斯分布的向量化表示。注意:留意上式中的 ( x − μ ) T ∣ Σ ∣ − 1 ( x − μ ) (\bm{x}-\bm{\mu})^T|\Sigma|^{-1}(\bm{x}-\bm{\mu}) (x−μ)T∣Σ∣−1(x−μ),它与下文将要介绍的 kernel function 有着类似的形式
高斯过程是定义在连续域上的无限多个高维随机变量所组成的随机过程,可以看做是一个无限维的高斯分布
数学定义
对于随机变量 { ζ t } t ∈ T \{\zeta_t\}_{t\in T} {ζt}t∈T, T T T 可以是连续的时间或空间
如果对于 ∀ n ∈ N + , t 1 , . . . , t n → ζ 1 , . . . , ζ n \forall\; n\in \N^+,\;\;t_1,...,t_n\to \zeta_1,...,\zeta_n ∀n∈N+,t1,...,tn→ζ1,...,ζn, 都有 ζ = ( ζ 1 , . . . , ζ n ) T ∼ N ( μ , Σ ) \bm{\zeta}=(\zeta_1,...,\zeta_n)^T \sim N(\bm{\mu},\bm{\Sigma}) ζ=(ζ1,...,ζn)T∼N(μ,Σ),
那么 { ζ t } t ∈ T \{\zeta_t\}_{t\in T} {ζt}t∈T 就是一个高斯过程,记做 ζ t ∼ G P ( m ( t ) , κ ( s , t ) ) (3) \tag{3}\zeta_t\sim GP(m(t),\kappa(s,t)) ζt∼GP(m(t),κ(s,t))(3)
where,
m ( t ) = E [ ζ t ] m(t)=E[\zeta_t] m(t)=E[ζt], mean function κ ( t , s ) = E [ ( ζ s − m ( s ) ) ( ζ t − m ( t ) ) T ] \kappa(t,s)=E[(\zeta_s-m(s))(\zeta_t-m(t))^T] κ(t,s)=E[(ζs−m(s))(ζt−m(t))T], covariance function t t t 只是一个 index,并不像是 f ( x ) f(x) f(x) 中的 x x x 那样的自变量回顾贝叶斯线性回归(见参考资料 2)
Inference: 求后验 P ( w ∣ D a t a ) = N ( w ∣ μ w , Σ w ) P(w|Data)=N(w|\mu_w,\Sigma_w) P(w∣Data)=N(w∣μw,Σw) where, { μ w = σ − 2 A − 1 X T Y Σ w = A − 1 A = σ − 2 X T X + Σ P − 1 \begin{cases} \mu_w=\sigma^{-2}A^{-1}X^TY \\ \Sigma_w=A^{-1} \\ A=\sigma^{-2}X^TX+\Sigma_P^{-1} \end{cases} ⎩⎪⎨⎪⎧μw=σ−2A−1XTYΣw=A−1A=σ−2XTX+ΣP−1Prediction: Given x ∗ \text{Given }x^* Given x∗ P ( f ( x ∗ ) ∣ D a t a , x ∗ ) = N ( ( x ∗ ) T μ w , ( x ∗ ) T Σ w x ∗ ) P ( y ∗ ∣ D a t a , x ∗ ) = N ( ( x ∗ ) T μ w , ( x ∗ ) T Σ w x ∗ + σ 2 ) P(f(x^*)|Data,x^*)=N((x^*)^T\mu_w,(x^*)^T\Sigma_wx^*) \\ P(y^*|Data,x^*)=N((x^*)^T\mu_w,(x^*)^T\Sigma_wx^*+\sigma^2) P(f(x∗)∣Data,x∗)=N((x∗)Tμw,(x∗)TΣwx∗)P(y∗∣Data,x∗)=N((x∗)Tμw,(x∗)TΣwx∗+σ2)但如果遇到的模型是非线性的,一般的做法可以是先做一个非线性转换 z = ϕ ( x ) , x ∈ R p , z ∈ R q z=\phi(x),\;\;x\in\R^p,\;\;z\in\R^q z=ϕ(x),x∈Rp,z∈Rq,然后再使用贝叶斯线性回归(该非线性转换一般把数据由低维转换成高维)
考虑不存在噪音的情况: f ( x ∗ ) ∣ X , Y , x ∗ ∼ N ( x ∗ ( σ − 2 A − 1 X T Y ) , ( x ∗ ) T A − 1 x ∗ ) f(x^*)|X,Y,x^*\sim N(x^*(\sigma^{-2}A^{-1}X^TY),(x^*)^TA^{-1}x^*) f(x∗)∣X,Y,x∗∼N(x∗(σ−2A−1XTY),(x∗)TA−1x∗) where, A = σ − 2 X T X + Σ P − 1 A=\sigma^{-2}X^TX+\Sigma_P^{-1} A=σ−2XTX+ΣP−1
If ϕ : x ↦ z , x ∈ R p , z = ϕ ( x ) ∈ R q , q > p Define Φ = ϕ ( X ) = [ ( ϕ ( x 1 ) , . . . , ϕ ( x N ) ) T ] N × q , X = [ ( x 1 , . . . , x N ) T ] N × p , Y = ( y 1 , . . . , y N ) T then f ( x ) = ϕ ( x ) T w \text{If }\phi:x\mapsto z,\;\;x\in\R^p,\;\;z=\phi(x)\in\R^q,\;\;q>p \\[3pt] \text{Define }\Phi=\phi(X)=[(\phi(x_1),...,\phi(x_N))^T]_{N\times q},\;\;X=[(x_1,...,x_N)^T]_{N\times p},\;\;Y=(y_1,...,y_N)^T \\[3pt] \text{then }f(x)=\phi(x)^Tw If ϕ:x↦z,x∈Rp,z=ϕ(x)∈Rq,q>pDefine Φ=ϕ(X)=[(ϕ(x1),...,ϕ(xN))T]N×q,X=[(x1,...,xN)T]N×p,Y=(y1,...,yN)Tthen f(x)=ϕ(x)Tw, let ϕ ∗ \phi_* ϕ∗ denotes ϕ ( x ∗ ) \phi(x^*) ϕ(x∗) f ( x ∗ ) ∣ X , Y , x ∗ ∼ N ( ϕ ∗ ( σ − 2 A − 1 Φ T Y ) , ϕ ∗ T A − 1 ϕ ∗ ) f(x^*)|X,Y,x^*\sim N(\phi_*(\sigma^{-2}A^{-1}\Phi^TY),\phi_*^TA^{-1}\phi_*) f(x∗)∣X,Y,x∗∼N(ϕ∗(σ−2A−1ΦTY),ϕ∗TA−1ϕ∗) where, A = σ − 2 Φ T Φ + Σ P − 1 A=\sigma^{-2}\Phi^T\Phi+\Sigma_P^{-1} A=σ−2ΦTΦ+ΣP−1
如何计算 A − 1 A^{-1} A−1? 使用:Woodbury formula ( A + U C V ) − 1 = A − 1 − A − 1 U ( C − 1 + V A − 1 U ) − 1 V A − 1 (A+UCV)^{-1}=A^{-1}-A^{-1}U(C^{-1}+VA^{-1}U)^{-1}VA^{-1} (A+UCV)−1=A−1−A−1U(C−1+VA−1U)−1VA−1
由此可得,
mean: ϕ ∗ ( σ − 2 A − 1 Φ T Y ) = ϕ ∗ Σ p Φ T ( K + σ 2 I ) − 1 Y \phi_*(\sigma^{-2}A^{-1}\Phi^TY)=\phi_*\Sigma_p\Phi^T(K+\sigma^2I)^{-1}Y ϕ∗(σ−2A−1ΦTY)=ϕ∗ΣpΦT(K+σ2I)−1Ycovariance: ϕ ∗ T A − 1 ϕ ∗ = ϕ ∗ T Σ p ϕ ∗ − ϕ ∗ T Σ p Φ T ( K + σ 2 I ) − 1 Φ Σ p ϕ ∗ \phi_*^TA^{-1}\phi_*=\phi_*^T\Sigma_p\phi_*-\phi_*^T\Sigma_p\Phi^T(K+\sigma^2I)^{-1}\Phi\Sigma_p\phi_* ϕ∗TA−1ϕ∗=ϕ∗TΣpϕ∗−ϕ∗TΣpΦT(K+σ2I)−1ΦΣpϕ∗where, K = Φ T Σ p Φ K=\Phi^T\Sigma_p\Phi K=ΦTΣpΦ
观察 κ ( x , x ′ ) \kappa(x,x') κ(x,x′) κ ( x , x ′ ) = ϕ ( x ) T Σ p ϕ ( x ′ ) = ϕ ( x ) T Σ p 1 2 Σ p 1 2 ϕ ( x ′ ) = ( Σ p 1 2 ϕ ( x ) ) T ( Σ p 1 2 ϕ ( x ′ ) ) = < ψ ( x ) , ψ ( x ′ ) > \begin{aligned} \kappa(x,x') &= \phi(x)^T\Sigma_p\phi(x')=\phi(x)^T\Sigma_p^{\frac{1}{2}}\Sigma_p^{\frac{1}{2}}\phi(x') \\ &= (\Sigma_p^{\frac{1}{2}}\phi(x))^T(\Sigma_p^{\frac{1}{2}}\phi(x')) \\ &=<\psi(x),\psi(x')> \end{aligned} κ(x,x′)=ϕ(x)TΣpϕ(x′)=ϕ(x)TΣp21Σp21ϕ(x′)=(Σp21ϕ(x))T(Σp21ϕ(x′))=<ψ(x),ψ(x′)>,
可见它可以被简化成两数内积的形式。 此时若进一步观察均值和协方差的表达式,可以发现除了 Y Y Y 以及 σ 2 I \sigma^2I σ2I,其余的所有部分都可以用 kernel function κ ( x , x ′ ) \kappa(x,x') κ(x,x′) 来表达
由此可得,该 kernel 已经包含了原特征空间的所有信息,从而可以成为一种原来方法的简单替代。GP的过程中 kernel function 的重要性就体现于它能将一个复杂问题转化成一个只需要考虑 kernel 的问题
weight-space view of GPR = Bayesian Linear Regression + Kernel trick (Non-linear Transformation, innner product)
先回顾对高斯过程的定义
对于随机变量 { ζ t } t ∈ T , T : continuous time/ space \{\zeta_t\}_{t\in T},\;\;T:\text{continuous time/ space} {ζt}t∈T,T:continuous time/ space
如果对于任意 ∀ n ∈ N + \;\forall\; n\in \N^+ ∀n∈N+, 都存在映射 t 1 , . . . , t n → ζ 1 , . . . , ζ n t_1,...,t_n\to \zeta_1,...,\zeta_n t1,...,tn→ζ1,...,ζn such that ζ = ( ζ 1 , . . . , ζ n ) T ∼ N ( μ , Σ ) \bm{\zeta}=(\zeta_1,...,\zeta_n)^T \sim N(\bm{\mu},\bm{\Sigma}) ζ=(ζ1,...,ζn)T∼N(μ,Σ), 那么就把 { ζ t } t ∈ T \{\zeta_t\}_{t\in T} {ζt}t∈T 记为高斯过程, 即 ζ t ∼ G P ( m ( t ) , κ ( t , s ) ) \zeta_t\sim GP(m(t),\kappa(t,s)) ζt∼GP(m(t),κ(t,s))
再回顾 weight-space view(其关注的对象为 w w w)
{ f ( x ) = ϕ ( x ) T w y = f ( x ) + ε , ε ∼ N ( 0 , σ ) \begin{cases} f(x)=\phi(x)^Tw \\ y=f(x)+\varepsilon,\;\;\varepsilon\sim N(0,\sigma) \end{cases} {f(x)=ϕ(x)Twy=f(x)+ε,ε∼N(0,σ)
结合 Section 2.3 中的结论,可以发现 GPR 的 wsv 和 GP 的定义似乎没啥关系。
的确如此,wsv 本质上是贝叶斯线性推断和核方法的结合物,只是能够恰好从另一方面体现高斯过程。而 function-space view 关注的对象则是 y y y,正如 GP 所定义的那样
就具体问题而言,使用 wsv 还是 fsv 没有差别
假设样本集 { f ( x ) } \{f(x)\} {f(x)} 满足 { f ( x ) } x ∈ R p ∼ G P ( m ( x ) , κ ( x , x ′ ) ) \{f(x)\}_{x\in \R^p}\sim GP(m(x),\kappa(x,x')) {f(x)}x∈Rp∼GP(m(x),κ(x,x′))
where,
m ( x ) = E [ f ( x ) ] m(x)=E[f(x)] m(x)=E[f(x)] κ ( x , x ′ ) = E [ ( f ( x ) − m ( x ) ) ( f ( x ′ ) − m ( x ′ ) ) T ] \kappa(x,x')=E[(f(x)-m(x))(f(x')-m(x'))^T] κ(x,x′)=E[(f(x)−m(x))(f(x′)−m(x′))T]Data : { ( x i , y i ) } i = 1 N , y = f ( x ) + ε X = [ ( x 1 , . . . , x N ) T ] N × p Y = [ ( y 1 , . . . , y N ) T ] N × 1 \text{Data}:\{(x_i,y_i)\}_{i=1}^N,\;\;\;\;y=f(x)+\varepsilon \\ X=[(x_1,...,x_N)^T]_{N\times p} \\ Y=[(y_1,...,y_N)^T]_{N\times 1} Data:{(xi,yi)}i=1N,y=f(x)+εX=[(x1,...,xN)T]N×pY=[(y1,...,yN)T]N×1
f ( X ) ∼ N ( μ ( X ) , κ ( X , X ) ) Y = f ( X ) + ε ∼ N ( μ ( X ) , κ ( X , X ) + σ 2 I ) f(X)\sim N(\mu(X),\kappa(X,X)) \\ Y=f(X)+\varepsilon \sim N(\mu(X),\kappa(X,X)+\sigma ^2I) f(X)∼N(μ(X),κ(X,X))Y=f(X)+ε∼N(μ(X),κ(X,X)+σ2I)
Given X ∗ = ( x 1 ∗ , . . . , x M ∗ ) T 求 Y ∗ Y ∗ = f ( X ∗ ) + ε ( Y f ( X ∗ ) ) ∼ N ( ( μ ( X ) μ ( X ∗ ) ) , ( κ ( X , X ) + σ 2 I κ ( X , X ∗ ) κ ( X ∗ , X ) κ ( X ∗ , X ∗ ) ) ) \text{Given}\;X^*=(x_1^*,...,x_M^*)^T \\ 求\;Y^* \\ Y^*=f(X^*)+\varepsilon \\ \begin{pmatrix} Y \\ f(X^*) \end{pmatrix} \sim N\begin{pmatrix} \begin{pmatrix} \mu(X) \\ \mu(X^*) \end{pmatrix}, \begin{pmatrix} \kappa(X,X)+\sigma^2I & \kappa(X,X^*) \\ \kappa(X^*,X) & \kappa(X^*,X^*) \end{pmatrix} \end{pmatrix} GivenX∗=(x1∗,...,xM∗)T求Y∗Y∗=f(X∗)+ε(Yf(X∗))∼N((μ(X)μ(X∗)),(κ(X,X)+σ2Iκ(X∗,X)κ(X,X∗)κ(X∗,X∗)))
已知公式,对于 X ∼ N ( μ , Σ ) X\sim N(\mu,\Sigma) X∼N(μ,Σ) If X = ( X a X b ) , μ = ( μ a μ b ) , Σ = ( Σ a a Σ a b Σ b a Σ b b ) then we have X b ∣ X a ∼ N ( μ b ∣ a , Σ b ∣ a ) \text{If}\;X=\begin{pmatrix} X_a \\ X_b \end{pmatrix}, \mu=\begin{pmatrix} \mu_a \\ \mu_b \end{pmatrix}, \Sigma=\begin{pmatrix} \Sigma_{aa} & \Sigma_{ab} \\ \Sigma_{ba} & \Sigma_{bb} \end{pmatrix} \\ \text{then we have }X_b|X_a\sim N(\mu_{b|a},\Sigma_{b|a}) IfX=(XaXb),μ=(μaμb),Σ=(ΣaaΣbaΣabΣbb)then we have Xb∣Xa∼N(μb∣a,Σb∣a) where,
μ b ∣ a = Σ b a Σ a a − 1 ( X a − μ a ) + μ b \mu_{b|a}=\Sigma_{ba}\Sigma_{aa}^{-1}(X_a-\mu_a)+\mu_b μb∣a=ΣbaΣaa−1(Xa−μa)+μb Σ b ∣ a = Σ b b − Σ b a Σ a a − 1 Σ a b \Sigma_{b|a}=\Sigma_{bb}-\Sigma_{ba}\Sigma_{aa}^{-1}\Sigma_{ab} Σb∣a=Σbb−ΣbaΣaa−1Σab根据该公式可得 P ( f ( X ∗ ) ∣ Y , X , X ∗ ) = P ( f ( X ∗ ) ∣ Y ) ∼ N ( μ ∗ , Σ ∗ ) P(f(X^*)|Y,X,X^*)=P(f(X^*)|Y)\sim N(\mu^*,\Sigma^*) P(f(X∗)∣Y,X,X∗)=P(f(X∗)∣Y)∼N(μ∗,Σ∗) where,
μ ∗ = κ ( X ∗ , X ) ( κ ( X , X ) + σ 2 I ) − 1 ( Y − μ ( X ) ) + μ ( X ∗ ) \mu^*=\kappa(X^*,X)(\kappa(X,X)+\sigma^2I)^{-1}(Y-\mu(X))+\mu(X^*) μ∗=κ(X∗,X)(κ(X,X)+σ2I)−1(Y−μ(X))+μ(X∗) Σ ∗ = κ ( X ∗ , X ∗ ) − κ ( X ∗ , X ) ( κ ( X , X ) + σ 2 I ) − 1 κ ( X , X ∗ ) \Sigma^*=\kappa(X^*,X^*)-\kappa(X^*,X)(\kappa(X,X)+\sigma^2I)^{-1}\kappa(X,X^*) Σ∗=κ(X∗,X∗)−κ(X∗,X)(κ(X,X)+σ2I)−1κ(X,X∗)因此, P ( y ∗ ∣ Y , X , X ∗ ) ∼ N ( μ ∗ , Σ ∗ + σ 2 I ) P(y^*|Y,X,X^*)\sim N(\mu^*,\Sigma^*+\sigma^2I) P(y∗∣Y,X,X∗)∼N(μ∗,Σ∗+σ2I)
简单高斯过程回归实现 (斜体部分内容来自参考资料 4)
考虑代码实现一个高斯过程回归,API 接口风格采用 sciki-learn fit-predict 风格。由于高斯过程回归是一种非参数化 (non-parametric) 的模型,每次的 inference 都需要利用所有的训练数据进行计算得到结果,因此并没有一个显式的训练模型参数的过程,所以 fit 方法只需要将训练数据保存下来,实际的 inference 在 predict 方法中进行。
结果如下图,红点是训练数据,蓝线是预测值,浅蓝色区域是 95% 置信区间。真实的函数是一个 cosine 函数,可以看到在训练数据点较为密集的地方,模型预测的不确定性较低,而在训练数据点比较稀疏的区域,模型预测不确定性较高。
详见 参考资料 4
定义类
classdef GPR properties is_fit = 0; train_X = nan; train_y = nan; params = struct('l', 0.5, 'sigma_f', 0.2); end methods function obj = GPR() end function obj = fit(obj, X, y) obj.train_X = X; obj.train_y = y; obj.is_fit = 1; end function [mu, cov] = predict(obj, X) if obj.is_fit == 0 disp('model not fit yet') end Kff = obj.kernel(obj.train_X, obj.train_X); Kyy = obj.kernel(X, X); Kfy = obj.kernel(obj.train_X, X); Kff_inv = inv(Kff + 1e-8 * eye(length(obj.train_X))); mu = Kfy' * Kff_inv * obj.train_y; cov = Kyy - Kfy' * Kff_inv * Kfy; end function result = kernel(obj, x1, x2) distance = x1.^2 + (x2.^2)' - 2 * x1 * x2'; sigma_f = obj.params.('sigma_f'); l = obj.params.('l'); result = sigma_f^2 * exp(-distance/(2*l^2)); end end end训练 + 预测
train_X = [3, 1, 4, 5, 9]'; train_y = cos(train_X); test_X = 0:0.1:10; test_X = test_X'; gpr = GPR(); gpr = gpr.fit(train_X, train_y); [mu, cov] = gpr.predict(test_X); uncertainty = 1.96 * sqrt(diag(cov)); figure; xfill = [test_X', fliplr(test_X')]; yfill = [(mu - uncertainty)', fliplr((mu + uncertainty)')]; fill(xfill, yfill, 'c', 'FaceAlpha', 0.5, 'EdgeAlpha', 1, 'EdgeColor', 'c'); hold on; plot(test_X, mu);结果示意图