高斯过程(一)

高斯分布

X = [ X 1 X 2 ⋮ X n ] ∼ N ( μ , Σ ) X = \begin{bmatrix} X_1 \\ X_2 \\ \vdots \\X_n \end {bmatrix} \sim \mathcal{N}(\mu, \Sigma) X= X1X2Xn N(μ,Σ)

X X X 服从高斯分布, μ \mu μ表示n维高斯分布的期望。

Σ = C o v ( X i , X j ) = E [ ( X i − μ i ) ( X j − μ j ) ] \Sigma = Cov(X_i,X_j) = E[(X_i-\mu_i)(X_j-\mu_j)] Σ=Cov(Xi,Xj)=E[(Xiμi)(Xjμj)],表示n维高斯分布的协方差矩阵。协方差矩阵是一个对称矩阵,矩阵的对角线元素决定 X X X对应维度的方差,非对角线元素建模对一个两个维度之间的相关性。

高斯分布具有在条件化和边缘化下闭合的良好代数特性。在条件化和边缘化下关闭意味着这些操作的结果分布也是高斯分布:

P X , Y = [ X Y ] ∼ N ( μ , Σ ) = N ( [ μ X μ Y ] , [ Σ X X , Σ X Y Σ Y X , Σ Y Y ] ) P_{X,Y} = \begin{bmatrix} X \\ Y \end {bmatrix} \sim \mathcal{N}(\mu, \Sigma) = \mathcal{N}(\begin{bmatrix} \mu_X \\\mu_Y \end{bmatrix}, \begin{bmatrix} \Sigma_{XX},\Sigma_{XY} \\ \Sigma_{YX},\Sigma_{YY} \end{bmatrix}) PX,Y=[XY]N(μ,Σ)=N([μXμY],[ΣXX,ΣXYΣYX,ΣYY])

边缘分布:

X ∼ N ( μ X , Σ X X ) X\sim\mathcal{N}(\mu_X,\Sigma_{XX}) XN(μX,ΣXX)

Y ∼ N ( μ Y , Σ Y Y ) Y\sim \mathcal{N}(\mu_Y,\Sigma_{YY}) YN(μY,ΣYY)

条件分布:

X ∣ Y ∼ N ( μ X + Σ X Y Σ Y Y − 1 ( Y − μ Y ) , Σ X X − Σ X Y Σ Y Y − 1 Σ Y X ) X|Y\sim \mathcal{N}(\mu_X + \Sigma_{XY}\Sigma_{YY}^{-1}(Y-\mu_Y), \Sigma_{XX} - \Sigma_{XY}\Sigma_{YY}^{-1}\Sigma_{YX}) XYN(μX+ΣXYΣYY1(YμY),ΣXXΣXYΣYY1ΣYX)

Y ∣ X ∼ N ( μ Y + Σ Y X Σ X X − 1 ( X − μ X ) , Σ Y Y − Σ Y X Σ X X − 1 Σ X Y ) Y|X\sim \mathcal{N}(\mu_Y+\Sigma_{YX}\Sigma_{XX}^{-1}(X-\mu_X), \Sigma_{YY}-\Sigma_{YX}\Sigma_{XX}^{-1}\Sigma_{XY}) YXN(μY+ΣYXΣXX1(XμX),ΣYYΣYXΣXX1ΣXY)

高斯过程

随机过程,比如高斯随机过程,本质上是一组随机变量。或则说,GP 可以看作是一个随机过程,对应于无限维高斯分布。高斯随机过程定义了函数的概率分布,每一个采样得到的样本,对应着一组函数值的实例。

下面通过一个例子说明多元高斯分布于函数之间的关系:

import math
import numpy as np
import matplotlib.pyplot as plt

def kernel(i, j):
    if i == j:
        return 0.5
    else:
        return 0.0

dim = 2
mean = [0 for i in range(dim)]
index = [i + 1 for i in range(dim)]
# 构造协方差矩阵
cov = []
for i in range(dim):
    p = []
    for j in range(dim):
        sigma = kernel(i, j)
        p.append(sigma)
    cov.append(p)
fig, ax = plt.subplots(figsize=(32, 8))
for sample in range(3):
    values = np.random.multivariate_normal(mean, cov, 1).T
    ax.plot(index, values, '-')

请添加图片描述

  • 例子中定义了一个均值为0、方差为0.5、不同维度协方差为0的2元高斯分布
  • 从分布中采样得到3个样本,将样本点的维度作为x轴,维度对应的值作为y轴,因此3个样本点对应3条直线

下面将样本高斯分布的维度扩展到100维(dim = 100)

...
dim = 100
...

![请添加图片描述](

可以看出函数不是很平滑,这是由于我们假设不同维度之间相互独立导致的,因此我们对维度之间的相关性加入一些假设,比如相近的位置之间相关性加到,距离较远的维度之间相关性较小。通过修改协方差举证函数的生成方式引入此假设:

import math
import numpy as np
import matplotlib.pyplot as plt
    
def kernel_rbf(i, j):
    # 新的协方差矩阵生成函数:维度之间不在相互独立,并且距离相近的维度之间相关性较大,
    # 距离较远的维度之间相关性较小
    sigma = 0.5
    l = 4.0
    return math.pow(sigma, 2) * math.exp(0 - math.pow(i - j, 2.0) / (2.0 * math.pow(l, 2.0)))


dim = 100
mean = [0 for i in range(dim)]
index = [i + 1 for i in range(dim)]
cov = []
for i in range(dim):
    p = []
    for j in range(dim):
        sigma = kernel_rbf(i, j)
        p.append(sigma)
    cov.append(p)
fig, ax = plt.subplots(figsize=(32, 8))
for sample in range(3):
    values = np.random.multivariate_normal(mean, cov, 1).T
    ax.plot(index, values, '-')

请添加图片描述

函数图形变得更加的平滑,到此我们对高斯过程和函数 f f f之间的对应关系,有了一个直观的认知。

最后我们可将多元高斯分布的维度从正整数扩展到实数 R R R,对应于无限维高斯分布,每个样本对应着一个函数,因此高斯过程可以视为函数空间的分布。

...
index = np.linspace(0, 1, dim)
...

请添加图片描述

高斯分布由期望和协方差矩阵唯一确定,不同的均值和协方差矩阵的选择,对应这对函数空间的不同假设。上面例子中采用的协方差生产函数kernel_rbf被称为高斯过程的核,常用的和包括:

k : R n × R n → R , Σ = C o v ( X , X ′ ) = k ( t , t ′ ) k:R^n\times R^n \rightarrow R, \Sigma = Cov(X,X') = k(t,t') k:Rn×RnR,Σ=Cov(X,X)=k(t,t)

σ 2 e x p ( − ∣ ∣ t − t ′ ∣ ∣ 2 2 l 2 ) \sigma^2exp(-\frac{||t-t'||^2}{2l^2}) σ2exp(2l2∣∣tt2)

σ 2 e x p ( − 2 s i n 2 ( π ∣ t − t ′ ∣ / p ) l 2 ) \sigma^2exp(-\frac{2sin^2(\pi|t-t'|/p)}{l^2}) σ2exp(l22sin2(πtt∣/p))

σ b 2 + σ 2 ( t − c ) ( t ′ − c ) \sigma_b^2 + \sigma^2(t-c)(t'-c) σb2+σ2(tc)(tc)

先验分布

在没有观测数据的情况下,采用的高斯分布称为函数空间的先验分布。比如上文中采用的两个分布

  • 均值为0,协方差矩阵为对角矩阵:对应的先验假设是均值为0,不同维度之间相互独立
  • 均值为0,核函数为RBF函数:对应的先验假设是均值为0,距离相近的维度之间相关性较大,距离较远的维度之间相关性较小
后验分布

有了部分观侧数据之后,结合观侧数据和先验假设,由贝叶斯估计,计算得到贝叶斯后验估计 P X ∣ Y P_{X|Y} PXY

P X , Y = [ X Y ] ∼ N ( 0 , Σ ) = N ( [ 0 0 ] , [ Σ X X , Σ X Y Σ Y X , Σ Y Y + ψ 2 I ] ) P_{X,Y} = \begin{bmatrix} X \\ Y \end {bmatrix} \sim \mathcal{N}(0, \Sigma) = \mathcal{N}(\begin{bmatrix} 0 \\ 0 \end{bmatrix}, \begin{bmatrix} \Sigma_{XX},\Sigma_{XY} \\ \Sigma_{YX},\Sigma_{YY} + \psi^2 I \end{bmatrix}) PX,Y=[XY]N(0,Σ)=N([00],[ΣXXΣXYΣYXΣYY+ψ2I])

X ∣ Y ∼ N ( μ X + Σ X Y Σ Y Y − 1 ( Y − μ Y ) , Σ X X − Σ X Y Σ Y Y − 1 Σ Y X ) X|Y\sim \mathcal{N}(\mu_X + \Sigma_{XY}\Sigma_{YY}^{-1}(Y-\mu_Y), \Sigma_{XX} - \Sigma_{XY}\Sigma_{YY}^{-1}\Sigma_{YX}) XYN(μX+ΣXYΣYY1(YμY),ΣXXΣXYΣYY1ΣYX)

= N ( Σ X Y Σ Y Y − 1 Y , Σ X X − Σ X Y Σ Y Y − 1 Σ Y X ) =\mathcal{N}(\Sigma_{XY}\Sigma_{YY}^{-1}Y, \Sigma_{XX} - \Sigma_{XY}\Sigma_{YY}^{-1}\Sigma_{YX}) =N(ΣXYΣYY1Y,ΣXXΣXYΣYY1ΣYX)

下面继续通过上文的例子,说明如果在先验假设中,结合观侧数据,对函数分布进行改进:

def create_cov(x1, x2):
    cov = []
    for i in range(len(x1)):
        p = []
        for j in range(len(x2)):
            sigma = kernel_rbf(x1[i], x2[j])
            p.append(sigma)
        cov.append(p)
    return np.matrix(cov)
    
test_x = np.linspace(0, 1, dim)

# 加入两个观侧样本
train_x = [0.3, 0.7]
train_y = [0.2, 0.1]

cov_xx = create_cov(test_x, test_x)  # 5 * 5
cov_yy = create_cov(train_x, train_x) # 2 * 2
cov_xy = create_cov(test_x, train_x)  # 5 * 2
cov_yx = create_cov(train_x, test_x)  # 2 * 25

np.matrix(train_y).T # 2 * 1

mean_post = cov_xy * cov_yy.I * np.matrix(train_y).T
cov_post = cov_xx - cov_xy * cov_yy.I * cov_yx

fig, ax = plt.subplots(figsize=(32, 8))
ax.plot(train_x, train_y, '.', markersize=32)

mean_post = np.reshape(mean_post, (1, -1)).tolist()[0]
for r in range(3):
    ys = np.random.multivariate_normal(mean_post, cov_post, 1).T
    ax.plot(test_x, ys, '-')

请添加图片描述

增大采样的次数为100

请添加图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值