前言
神经过程neural processes, NP 是2018年ICML会议上提出的一种新的神经网络范式,总的来说是将高斯过程Gaussian Processes, GP 网络化,从而降低GP对计算量的要求。GP的好处是天然地能够对预测的结果给出一个置信度的评分,即uncertainty or confidence, 而且GP模型是非参数的(non parametric ,即模型参数的数量取决于数据集的大小),会根据输入样例自动抽取规律,不断更新自己的预测信息。相比之下,一般的神经网络在训练结束后,模型参数将被固定,无法一直学习。下文首先介绍GP的基础知识,然后过渡到NP模型,中间会插入一些toy example,即小的例子,来更深入地理解GP和NP模型的特点。讲解的过程中会有很多个人的观点且需要有一点点概率论和信号估计理论的基础知识,如有错误欢迎指正和讨论。
1. Gaussian Process (GP)
Gaussian Process的定义:如果对于任意的子集 { x 1 , x 2 , ⋯ , x n } ⊂ X \{x_1,~x_2,\cdots,x_n\}\subset\mathcal{X} {x1, x2,⋯,xn}⊂X, 采样一个 X → R \mathcal{X}\rightarrow\mathbb{R} X→R的映射函数 f ∼ p ( f ) f\sim p(f) f∼p(f), 记 f = ( f ( x 1 ) , f ( x 2 ) , ⋯ , f ( x n ) ) ∈ R n \mathbf{f}=\left(f(x_1),~f(x_2),\cdots,~f(x_n)\right)\in\mathbb{R}^n f=(f(x1), f(x2),⋯, f(xn))∈Rn, 都有 f ∼ N ( ⋅ , ⋅ ) \mathbf{f}\sim\mathcal{N}(\cdot,~\cdot) f∼N(⋅, ⋅), 即 p ( f ) p(f) p(f)服从多元高斯分布(multivariate Gaussiandistribution)。那么称 p ( f ) p(f) p(f)是高斯过程Gaussian Process
上面的定义应该怎么理解呢?最后一句表明, 高斯过程是一个概率分布
p
(
f
)
p(f)
p(f),而这个概率分布对应的随机变量是一个函数
f
f
f。这是高斯过程相对于其他机器学习模型最大的不同点,我们所熟知的机器学习模型都是先假设模型能够完全拟合输入输出数据,然后训练或迭代模型参数,这种学习范式对应的函数
f
f
f是确定的,通过样本数据学习模型的参数,优化目标是由先验知识确定的模型的参数。一种另辟蹊径的方法是将拟合输入输出数据的函数作为优化目标,这个目标是函数本身也就是模型本身,是数学上的泛函问题。然而这个函数的候选者数量是无限的,函数形式是未知的。高斯过程模型则是将这种一般化的思路,加入了前提和假设,使得构造的问题能够被求解出来。如下面的例子:
y
=
f
(
x
)
+
ε
y
=
ω
T
x
+
ε
⋯
⋯
O
L
S
a
n
d
r
i
d
g
e
r
e
g
r
e
s
s
i
o
n
y
=
ω
T
ϕ
(
x
)
+
ε
⋯
⋯
k
e
r
n
e
l
r
e
g
r
e
s
s
i
o
n
\begin{aligned} y=&f(x)+\varepsilon\\ y=&\omega^Tx+\varepsilon~~\cdots~\cdots~OLS~and~ridge~regression\\ y=&\omega^T\phi(x)+\varepsilon~~\cdots~\cdots~kernel~regression \end{aligned}
y=y=y=f(x)+εωTx+ε ⋯ ⋯ OLS and ridge regressionωTϕ(x)+ε ⋯ ⋯ kernel regression高斯过程以概率为框架,将输入
x
x
x输出
y
y
y的回归问题转化为寻找这个未知的函数
f
f
f,其中
y
=
f
(
x
)
y=f(x)
y=f(x),的概率分布问题,然后以假定观测值
y
y
y经过
f
f
f映射后组成的随机序列满足多元高斯分布。基于此利用贝叶斯定理和多元高斯函数的边缘分布marginalizatiion distribution和条件分布conditioning distribution求解问题。下面我们将对整个求解过程逐一展开。(PS: 从名字上理解,高斯过程和随机过程,这里的过程应该是抽样这个动作的意思,随机过程的定义是在一个变量集合里面随机采样出一个变量的过程; 所以对应地高斯过程可以理解为在一组由无限个可能的均值
μ
\mu
μ 和无限个可能的方差
Σ
\Sigma
Σ 组合成的多元高斯函数集合中采样出一个符合给定输入样例的函数的过程,而且这个函数并不是一个确定函数,而是一个以给定训练数据集
D
\mathcal{D}
D 和给定输入
x
x
x 为条件的输出的采样函数
f
=
p
(
y
∣
D
,
x
)
∼
G
P
=
N
(
μ
y
∣
D
,
Σ
y
∣
D
)
f=p(y|\mathcal{D},~x)\sim\mathcal{GP}=\mathcal{N}(\mu_{y|\mathcal{D}}, \Sigma_{y|\mathcal{D}})
f=p(y∣D, x)∼GP=N(μy∣D,Σy∣D)。
1.0 预备知识
预备知识可以参考这条有趣的链接:https://jgoertler.com/visual-exploration-gaussian-processes/
- 多元高斯函数(multi-variate Gaussian function)的数学描述:
x = [ x 1 x 2 ⋯ x n ] T ∼ N x ( μ , Σ ) \mathbf{x}=\left[ \begin{array}{cccc} x_1&x_2& \cdots &x_n \end{array} \right]^T\sim\mathcal{N}_\mathbf{x}(\mu,~\Sigma) x=[x1x2⋯xn]T∼Nx(μ, Σ)多元高斯函数也叫多元正态分布函数,其中
N x ( μ , Σ ) = 1 ( 2 π ) n / 2 ∣ Σ ∣ 1 / 2 e x p ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) \mathcal{N}_\mathbf{x}(\mu,~\Sigma) = \frac{1}{(2\pi)^{n/2}|\Sigma|^{1/2}}exp\left(-\frac{1}{2}(\mathbf{x}-\mu)^T\Sigma^{-1}(\mathbf{x}-\mu)\right) Nx(μ, Σ)=(2π)n/2∣Σ∣1/21exp(−21(x−μ)TΣ−1(x−μ)) ∣ Σ ∣ |\Sigma| ∣Σ∣ 表示计算 Σ \Sigma Σ 矩阵的行列式(determination), μ = E [ x ] \mu=\mathbb{E}[\mathbf{x}] μ=E[x] 是随机变量 x \mathbf{x} x 的期望(expectation),在高斯函数中也叫均值。这里我们可以类比联想两个随机变量的协方差矩阵Covariance matrix,计算的是两个随机变量各个维度两两之间的相关程度:
C o v ( x , y ) = E [ ( x − E [ x ] ) ( y − E [ y ] ) ] = E [ x y ] − E [ x ] E [ y ] Cov(\mathbf{x},~\mathbf{y})=\mathbb{E}\left[(\mathbf{x}-\mathbb{E}[\mathbf{x}])(\mathbf{y}-\mathbb{E}[\mathbf{y}])\right] = \mathbb{E}[\mathbf{x}\mathbf{y}]-\mathbb{E}[\mathbf{x}]\mathbb{E}[\mathbf{y}] Cov(x, y)=E[(x−E[x])(y−E[y])]=E[xy]−E[x]E[y] 而 Σ = C o v ( x , x ) = E [ ( x − μ ) ( x − μ ) T ] = E [ x x T ] − μ μ T \Sigma=Cov(\mathbf{x},~\mathbf{x})=\mathbb{E}\left[(\mathbf{x}-\mu)(\mathbf{x}-\mu)^T\right]=\mathbb{E}[\mathbf{x}\mathbf{x}^T]-\mu\mu^T Σ=Cov(x, x)=E[(x−μ)(x−μ)T]=E[xxT]−μμT 为协方差,计算的是一个自相关矩阵,是一个对称的正定矩阵,对于任意的一个随机向量的协方差矩阵,它都是半正定矩阵。 - 多元高斯函数的边缘分布:
假设随机变量拆分为两部分 x \mathbf{x} x 和 y \mathbf{y} y,那么多元高斯函数的数学描述形式可以改写如下:
[ x y ] ∼ N ( [ μ x μ y ] , [ Σ x x Σ x y Σ y x Σ y y ] ) \left[ \begin{array}{c}\mathbf{x}\\\mathbf{y}\end{array} \right]\sim\mathcal{N}\left( \left[ \begin{array}{c}\mu_\mathbf{x}\\\mu_\mathbf{y}\end{array} \right],~\left[ \begin{array}{cc}\Sigma_{\mathbf{x}\mathbf{x}} & \Sigma_{\mathbf{x}\mathbf{y}} \\ \Sigma_{\mathbf{y}\mathbf{x}} & \Sigma_{\mathbf{y}\mathbf{y}} \end{array} \right] \right) [xy]∼N([μxμy], [ΣxxΣyxΣxyΣyy])记 x x x 和 y y y 分别为随机变量 x \mathbf{x} x 和 y \mathbf{y} y 采样后的具体值,realization sample。假设随机变量序列 x \mathbf{x} x 和 y \mathbf{y} y(或说样本)之间独立同分布(identity independent distribution, iid.),则有 p x y ( x , y ) = p y ∣ x ( y ∣ x ) p x ( x ) = p x ∣ y ( x ∣ y ) p y ( y ) p_{\mathbf{x}\mathbf{y}}(x,~y)=p_{\mathbf{y}|\mathbf{x}}(y|x)p_\mathbf{x}(x)=p_{\mathbf{x}|\mathbf{y}}(x|y)p_\mathbf{y}(y) pxy(x, y)=py∣x(y∣x)px(x)=px∣y(x∣y)py(y):
p x ( x ) = ∫ y p x y ( x , y ) d y = ∫ y p x ∣ y ( x ∣ y ) p y ( y ) d y p_\mathbf{x} (x) =\int_yp_{\mathbf{x}\mathbf{y}}(x,~y) dy = \int_yp_{\mathbf{x}|\mathbf{y}}(x|y)p_\mathbf{y}(y) dy px(x)=∫ypxy(x, y)dy=∫ypx∣y(x∣y)py(y)dy其中, p x y ( x , y ) p_{\mathbf{x}\mathbf{y}}(x,~y) pxy(x, y) 表示两个随机变量的联合概率分布, p x ∣ y ( x ∣ y ) p_{\mathbf{x}|\mathbf{y}}(x|y) px∣y(x∣y) 表示给定 y y y 的情况下随机变量 x \mathbf{x} x 的条件概率分布 (conditioned on y \mathbf{y} y),而 p x ( x ) p_\mathbf{x}(x) px(x) 和 p y ( y ) p_\mathbf{y}(y) py(y) 分别表示随机变量 x \mathbf{x} x 和 y \mathbf{y} y 相对于联合概率分布的边缘概率分布。 - 多元高斯函数的条件分布:
利用贝叶斯条件概率公式和高斯函数运算的一些基本法则:
p ( x ∣ y ) = p ( x , y ) p ( y ) = p ( y ∣ x ) p ( x ) p ( y ) \begin{equation}p(x|y)=\frac{p(x,~y)}{p(y)}=\frac{p(y|x)p(x)}{p(y)}\end{equation} p(x∣y)=p(y)p(x, y)=p(y)p(y∣x)p(x)经过整理可以得到条件概率的计算结果如下:
x ∣ y ∼ N ( μ x + Σ x y Σ y y − 1 ( y − μ y ) , Σ x x − Σ x y Σ y y − 1 Σ y x ) y ∣ x ∼ N ( μ y + Σ y x Σ x x − 1 ( x − μ x ) , Σ y y − Σ y x Σ x x − 1 Σ x y ) \begin{aligned} \mathbf{x}|\mathbf{y}&\sim\mathcal{N}\left(\mu_\mathbf{x}+\Sigma_{\mathbf{xy}}\Sigma_\mathbf{yy}^{-1}(\mathbf{y}-\mu_\mathbf{y}),~\Sigma_\mathbf{xx}-\Sigma_\mathbf{xy}\Sigma_\mathbf{yy}^{-1}\Sigma_\mathbf{yx}\right) \\ \mathbf{y}|\mathbf{x}&\sim\mathcal{N}\left(\mu_\mathbf{y}+\Sigma_{\mathbf{yx}}\Sigma_\mathbf{xx}^{-1}(\mathbf{x}-\mu_\mathbf{x}),~\Sigma_\mathbf{yy}-\Sigma_\mathbf{yx}\Sigma_\mathbf{xx}^{-1}\Sigma_\mathbf{xy}\right) \end{aligned} x∣yy∣x∼N(μx+ΣxyΣyy−1(y−μy), Σxx−ΣxyΣyy−1Σyx)∼N(μy+ΣyxΣxx−1(x−μx), Σyy−ΣyxΣxx−1Σxy)上面的整理结果将会在高斯过程回归(Gaussian process regression, GPR)中经常使用。 - 其他小知识点:
1). 如果 a ∼ μ a , Σ a a\sim\mathcal{\mu_a,~\Sigma_a} a∼μa, Σa, b = A a + η b=Aa+\eta b=Aa+η, η ∼ N ( 0 , Σ η ) \eta\sim\mathcal{N}(0,~\Sigma_\eta) η∼N(0, Ση), 那么 b ∼ N ( A μ a , A Σ a A T + Σ η ) b\sim\mathcal{N}(A\mu_a,~A\Sigma_aA^T+\Sigma_\eta) b∼N(Aμa, AΣaAT+Ση)。
2). 如果 [ x y ] ∼ N ( [ a b ] , [ A C C T B ] ) \left[ \begin{array}{c}x\\y\end{array} \right]\sim\mathcal{N}\left( \left[ \begin{array}{c}a\\b\end{array} \right],~\left[ \begin{array}{cc}A & C \\ C^T & B \end{array} \right] \right) [xy]∼N([ab], [ACTCB]) 那么 (推导过程网上一抓一大把) x ∣ y ∼ N ( a + C B − 1 ( y − b ) , A − C B − 1 C T ) x|y\sim\mathcal{N}(a+CB^{-1}(y-b),~A-CB^{-1}C^T) x∣y∼N(a+CB−1(y−b), A−CB−1CT)
3). 贝叶斯公式Bayes formula
p o s t e r i o r = l i k e l i h o o d × p r i o r m a r g i n a l l i k e l i h o o d , p ( x ∣ y ) = p ( x , y ) p ( y ) = p ( y ∣ x ) p ( x ) p ( y ) posterior =\frac{likelihood\times prior}{marginal~~likelihood},~p(x|y)=\frac{p(x, y)}{p(y)}=\frac{p(y|x)p(x)}{p(y)} posterior=marginal likelihoodlikelihood×prior, p(x∣y)=p(y)p(x,y)=p(y)p(y∣x)p(x)
1.1 问题描述
为了更好地理解高斯过程,我们首先从实际用例出发现构建一个回归问题:
给定一组输入输出样例数据 ( x s ∈ R n , y s ∈ R n ) = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x n , y n ) } (x_s\in\mathbb{R}^n,~y_s\in\mathbb{R}^n)=\{(x_1,~y_1), ~(x_2,~y_2),~\cdots,~(x_n,~y_n)\} (xs∈Rn, ys∈Rn)={(x1, y1), (x2, y2), ⋯, (xn, yn)},其中 x i x_i xi为输入样本, y i y_i yi为输出样本,现给定新的输入 x t ∈ R m x_t\in\mathbb{R}^m xt∈Rm,预测 y t ∈ R m y_t\in\mathbb{R}^m yt∈Rm。
这是典型的回归问题,问题的核心在于通过数据驱动的方式拟合出输入输出的映射关系 f f f,使得 y ′ = f ( x ′ ) y^\prime=f(x^\prime) y′=f(x′) 。记 y s = ( y 1 , y 2 , ⋯ , y n ) y_s=(y_1,~y_2,~\cdots,~y_n) ys=(y1, y2, ⋯, yn), x s = ( x 1 , x 2 , ⋯ , x n ) x_s=(x_1,~x_2,~\cdots,~x_n) xs=(x1, x2, ⋯, xn); G P ( f ∣ μ ( D ) , Σ ( D ) ) \mathcal{GP}(f|\mu(\mathcal{D}), \Sigma(\mathcal{D})) GP(f∣μ(D),Σ(D)) 为多元高斯函数集合。高斯过程首先假设输出序列 y y y 服从多元高斯分布(现实世界中往往不完全符合,但是为了求解问题,当我们决定使用GP这种方法的时候就已经默认 y y y 近似服从多元高斯分布)。高斯过程最终的预测输出结果是对映射函数的后验概率进行采样 y ′ ∼ p ( f ∣ x , y , x ′ ) y^\prime\sim p(f|x,~y,~x^\prime) y′∼p(f∣x, y, x′)。由于整个过程都是对多元高斯函数的计算,因此后验概率也是多元高斯分布的形式,高斯过程的高明之处在于映射函数可以用均值和方差参数化表示。
1.2 求解方法
上述问题可以用数学公式描述为: y = f ( x ) y=f(x) y=f(x)。目标是预测映射函数 f f f 的后验分布 y t ∼ p ( f ∣ D , x t ) y_t\sim p(f|\mathcal{D}, x_t) yt∼p(f∣D,xt) ,目标是根据输入数据预测模型的均值和方差,最后再根据贝叶斯公式,计算给定样本条件下的输出的条件概率做预测。根据贝叶斯概率框架的基本思想是先根据先验知识prior knowledge猜测变量的概率分布,再根据观测的数据likelihood调整概率分布posterior,这种方法有很多个名字但表达都是同样的概念:最大后验方法 MAP maximum a posterior 或者是岭回归ridge regression. p ( f ∣ D ) = p ( D ∣ f ) p ( f ) p ( D ) p(f|\mathcal{D})=\frac{p(\mathcal{D}|f)p(f)}{p(\mathcal{D})} p(f∣D)=p(D)p(D∣f)p(f) 解题步骤如下:
- Step 1: 在上述问题中,
f
f
f 是对
G
P
\mathcal{GP}
GP 的采样,所以
y
y
y 是满足高斯分布的,根据上面提到的方法,我们假定输出
y
y
y的方差与输入
x
x
x的方差相等,这个时候,
y
y
y 的分布如下。 这样做没有毛病是因为我们有贝叶斯公式调整最后的结果,盲猜一下问题不大。
[ y y t ] ∼ N ( [ μ ( y ) μ ( y t ) ] , [ K ( x , x ′ ) K ( x , x t ′ ) K ( x t , x ′ ) K ( x t , x t ′ ) ] ) \begin{equation}\left[ \begin{array}{c}y\\y_t\end{array} \right]\sim\mathcal{N}\left( \left[ \begin{array}{c}\mu(y)\\ \mu_(y_t)\end{array} \right],~\left[ \begin{array}{cc}\mathcal{K}(x,~x^\prime) & \mathcal{K}(x,~x_t^\prime) \\ \mathcal{K}(x_t,~x^\prime) & \mathcal{K}(x_t,~x_t^\prime) \end{array} \right] \right)\end{equation} [yyt]∼N([μ(y)μ(yt)], [K(x, x′)K(xt, x′)K(x, xt′)K(xt, xt′)])其中, K \mathcal{K} K 表示计算两个向量之间的距离度量 (covariance, kernel), μ \mu μ 表示均值(mean)函数。 - Step 2: 当观测数据
y
y
y来了之后,我们先把上式的
x
x
x项去掉,根据上面的多元高斯函数条件概率公式 (1) 可以得到条件概率分布,对步骤1的猜测进行修正:
y t ∣ D , x t ∼ N ( μ y t ∣ D , x t , Σ y t ∣ D , x t ) μ y t ∣ D , x t = μ ( y t ) + K ( x t , x ′ ) K ( x , x ′ ) − 1 ( y − μ ( y ) ) Σ y t ∣ D , x t = K ( x t , x t ′ ) − K ( x t , x ′ ) K ( x , x ′ ) − 1 K ( x , x t ′ ) \begin{equation} \begin{aligned} y_t|\mathcal{D}, x_t \sim&~\mathcal{N}(\mu_{y_t|\mathcal{D}, x_t},~\Sigma_{y_t|\mathcal{D}, x_t})\\ \mu_{y_t|\mathcal{D}, x_t} =&~ \mu(y_t) + \mathcal{K}(x_t,~x^\prime) \mathcal{K}(x,~x^\prime)^{-1}(y-\mu(y)) \\ \Sigma_{y_t|\mathcal{D}, x_t} =&~ \mathcal{K}(x_t,~x_t^\prime)-\mathcal{K}(x_t,~x^\prime) \mathcal{K}(x,~x^\prime)^{-1}\mathcal{K}(x,~x_t^\prime) \end{aligned} \end{equation} yt∣D,xt∼μyt∣D,xt=Σyt∣D,xt= N(μyt∣D,xt, Σyt∣D,xt) μ(yt)+K(xt, x′)K(x, x′)−1(y−μ(y)) K(xt, xt′)−K(xt, x′)K(x, x′)−1K(x, xt′)
1.3 Question & Answer
以上就是Gaussian Process Regression (GPR) 的整个求解过程。下面我们将会通过Socrates的方式,通过提问和解答的方式来进一步理解公式(3)所告诉我们的内容:
-
- 为什么高斯过程回归预测输出的同时可以给出预测结果的不确定性值?
因为公式(3)的输出包含了方差和均值,正常来说,预测值应该通过对(3)结果中均值和方差构成的多元高斯函数进行采样获得。实际上可以直接取均值,而不确定性则是由对应的方差项得出。
- 为什么高斯过程回归预测输出的同时可以给出预测结果的不确定性值?
-
- 公式(2)中,为什么不用y直接统计出方差?
从公式推导来看,是因为如果 y y y的分布全都使用 y y y的信息, y y y将完全独立,而不是以 x x x为条件, x x x的信息也将没有办法融合到整个推导框架中。
- 公式(2)中,为什么不用y直接统计出方差?
-
- 高斯过程回归能够预测输出的原理是什么?
当我们仔细观察的公式(3)不难看出,我们可以改写均值的公式为: μ y ∣ D , x t = μ ( y t ) + Φ ( x , x t ) ( y − μ ( y t ) ) \mu_{y|\mathcal{D}, x_t}=\mu(y_t)+\Phi(x, x_t)(y-\mu(y_t)) μy∣D,xt=μ(yt)+Φ(x,xt)(y−μ(yt)), 假设我们令 μ ( y ) = 0 \mu(y)=0 μ(y)=0,则有 μ y ∣ D , x t = Φ ( x , x t ) y \mu_{y|\mathcal{D}, x_t}=\Phi(x, x_t)y μy∣D,xt=Φ(x,xt)y。即,预测输出 y t = μ y ∣ D , x t y_t=\mu_{y|\mathcal{D}, x_t} yt=μy∣D,xt是训练集中的输出 y y y 的线性组合,而整个预测的不确定性 Σ y t ∣ D , x t \Sigma_{y_t|\mathcal{D},~x_t} Σyt∣D, xt 完全由 x x x 和 x t x_t xt 决定。再细看 K \mathcal{K} K的计算,更准确地说是由 x t x_t xt 处于 x x x 中的位置决定的。因此,总的来说,高斯过程回归实际上是提供了更加系统的数据插值方法(预测输出实际上就是在做数据的插值interpolation),它根据待预测的输入数据 x t x_t xt 是否足够靠近训练集中的样本 x x x 来确定预测的置信度,也根据自己与训练样本的输入来分配对应输出值的权重分配 Φ ( x , x t ) \Phi(x, x_t) Φ(x,xt),最后输出预测值。思想非常的简单,同时数学上的表述也非常的优美。
- 高斯过程回归能够预测输出的原理是什么?
-
- 为什么度量距离的核函数
K
\mathcal{K}
K 这么重要?
核函数之所以这么重要是因为对于训练样本中不存的输入,最终输出的权重分配是由核函数确定的,因此对于没有见过的样本,和距离训练集样本较远的待预测样本,其差值结果完全取决于核函数的选取。这也是为什么教程中屡屡强调核函数的重要性。
- 为什么度量距离的核函数
K
\mathcal{K}
K 这么重要?
1.4 举个栗子写段代码
参照这个链接的用例,魔改了一下gaussian process函数,最终结果如下:
import numpy as np
import scipy
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.axes_grid1 import make_axes_locatable
import matplotlib.gridspec as gridspec
import seaborn as sns
# Set matplotlib and seaborn plotting style
sns.set_style('darkgrid')
np.random.seed(42)
def exponentiated_quadratic(x, y):
sq_norm = -0.5*scipy.spatial.distance.cdist(x, y, 'sqeuclidean') # 计算两两样本之间的距离
return np.exp(sq_norm)
class myGP:
def __init__(self):
pass
def run_demo(self, domain = (-6, 6)):
f_sin = lambda x: (np.sin(x)).flatten()
n1 = 8 # number of points to condition on (training point)
n2 = 75 # number of points in posterior (test points)
ny = 5 # number of functions that will be sampled from the posterier
X1 = np.random.uniform(domain[0]+2, domain[1]-2, size=(n1, 1))
y1 = f_sin(X1)
X2 = np.linspace(domain[0], domain[1], n2).reshape(-1, 1)
mu2, Sigma2 = self.gaussian_process(X1, y1, X2, exponentiated_quadratic)
# Compute posterior mean and covariance
sig2 = np.sqrt(np.diag(Sigma2))
# Draw some samples of the posterior
y2 = np.random.multivariate_normal(mean=mu2, cov=Sigma2, size=ny)
# Plot the postior distribution and some samples
fig, (ax1, ax2) = plt.subplots(
nrows=2, ncols=1, figsize=(6, 6))
# Plot the distribution of the function (mean, covariance)
ax1.plot(X2, f_sin(X2), 'b--', label='$sin(x)$')
ax1.fill_between(X2.flat, mu2-2*sig2, mu2+2*sig2, color='red',
alpha=0.15, label='$2 \sigma_{2|1}$')
ax1.plot(X2, mu2, 'r-', lw=2, label='$\mu_{2|1}$')
ax1.plot(X1, y1, 'ko', linewidth=2, label='$(x_1, y_1)$')
ax1.set_xlabel('$x$', fontsize=13)
ax1.set_ylabel('$y$', fontsize=13)
ax1.set_title('Distribution of posterior and prior data.')
ax1.axis([domain[0], domain[1], -3, 3])
ax1.legend()
# Plot some samples from this function
ax2.plot(X2, y2.T, '-')
ax2.set_xlabel('$x$', fontsize=13)
ax2.set_ylabel('$y$', fontsize=13)
ax2.set_title('5 different function realizations from posterior')
ax1.axis([domain[0], domain[1], -3, 3])
ax2.set_xlim([-6, 6])
plt.tight_layout()
plt.show()
def gaussian_process(self, X1, y1, X2, kernel_func):
sigma11 = kernel_func(X1, X1)
sigma12 = kernel_func(X1, X2)
tmp1112 = np.dot(sigma12.transpose(), np.linalg.pinv(sigma11)) # Sigma21=sigma12.transpose()
mu2 = np.dot(tmp1112, y1)
Sigma22 = kernel_func(X2, X2)
Sigma2 = Sigma22 - np.dot(tmp1112, sigma12)
return mu2, Sigma2
if __name__ == '__main__':
gp = myGP()
gp.run_demo()
这里我们用到了scipy中的scipy.spatial.distance.cdist(x, y, ‘sqeuclidean’) 来计算两两用例之间的距离关系,核函数类型可以通过最后一个参数给定。
以上,
2023年4月23日
Dianye