机器学习笔记:高斯过程

Posted UQI-LIUWJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习笔记:高斯过程相关的知识,希望对你有一定的参考价值。

1 高斯分布回顾

一维高斯分布 

        当维度上升到多维的时候(比如有限的p维),我们称之为高维高斯分布,记作:

        其中 μ是p维向量,表示每个维度的均值,Σ的第(i,j)项表示第i个维度和第j个维度之间的协方差

2 高斯过程

高斯过程可以看成是定义在连续域上的无限维高斯分布

用符号表示,有:

 2.1 高斯过程举例

以下图为例,假设横轴表示时间,纵轴表示体能值。

假设对于某一个物种而言,在任何时刻,体能值都满足正态分布(只不过不同的时间点,分布的均值和方差可能不同)

 

        我们在图中选取了5个点对应5个时刻的体能值,分别满足高斯分布

        不失一般性,我们有:任取一个时刻t,

        而图中的两条虚线是两个高斯过程的样本。也即我们取遍所有时刻的t,获得的连成的一条虚线 

 2.2 形式化语言描述高斯过程

我们和p维的高斯分布进行类比:

p维高斯分布高斯过程(无限维高斯分布)
均值关于时刻t的函数,m(t)
方差

核函数(协方差函数)k(s,t),其中s和t分别代表任意两个时刻

表示

 2.3 径向基函数(RBF)

这是一种较为常见的核函数

 

  •  这里的σ和l是径向基函数的超参数,是可以提前设置好的
  • s和t表示高斯过程连续域上的两个不同的时间点,两个点距离越大,两个分布之间的协方差值越小,相关性越小

2.3.1RBF代码

import numpy as np
def rbf(x):
    sigma=1
    l=1
    #设置两个rbf的超参数
    
    m=x.shape[0]

    k=np.zeros((m,m))
#初始化这个数据的径向基矩阵
    
    for i in range(m):
        for j in range(m):
            k[i][j]=np.exp(-np.sum((x[i]-x[j])**2)/2)
#这里为什么要sum呢?因为我某一个时刻,特征可能不止一个维度(就像这里我们每个时刻是两个维度)
    return(k)

a=np.array([[1,2],
           [3,4],
           [5,6]])

#三个时刻的数据,每个时刻有两维特征

rbf(a)
'''
array([[1.00000000e+00, 1.83156389e-02, 1.12535175e-07],
       [1.83156389e-02, 1.00000000e+00, 1.83156389e-02],
       [1.12535175e-07, 1.83156389e-02, 1.00000000e+00]])
'''
#这相当于一个3*3的协方差矩阵

3 高斯过程回归

这个过程可以看成先验概率+观测值——>后验概率的过程

先验概率:通过μ(t)和k(s,t)定义一个高斯过程

3.1 高维高斯分布的条件概率

高斯分布的联合概率,边缘概率和条件概率都仍然满足高斯分布

假设n维随机变量满足:

如果我们把这n维的随机变量分成两部分:p维的xa和q维的xb,(q+p=n),那么我们有:

 其中 ,

同时,条件概率也是高维高斯分布

 3.2 类比到高斯过程回归

        我们将均值向量换成均值函数,把协方差矩阵换成核函数,把高维高斯分布看成高斯过程(无限维高斯分布)

假设我们有观测值(X,Y),于是我们记其他的非观测点是

首先,联合分布是满足无限维高斯分布的

 与此同时,条件概率也满足无限维高斯分布(高斯过程)

类比前面的,我们现在有:

 

 

 3.3高斯过程实例

 下面我们来实际的进行代码演示

令:

【注:这里的μ(X)是Y的分布的均值,不是X的分布均值

中的 

 取四个观测值 X=[1,3,7,9] ,Y为

 我们在四个观测点的基础上,来求高斯过程的后验。

 在下面的具体程序实现中,由于绘图是离散化处理的,因此连续域上的均值函数以及核函数,我们使用一个 很大的 n 维均值向量以及n×n  协方差矩阵进行表示

 3.3.1 代码部分

import numpy as np
import matplotlib.pyplot as plt
def rbf(x,y,l=0.5,simga=0.2):
    sigma=1
    l=1
    #设置两个rbf的超参数
    
    m=x.shape[0]
    n=y.shape[0]

    k=np.zeros((m,n), dtype=float)
    #初始化这个数据的径向基矩阵
    
    for i in range(m):
        for j in range(n):
            k[i][j]=np.exp(-np.sum((x[i]-y[j])**2)/(2*l**2))*simga**2
            #这里为什么要sum呢?因为我某一个时刻,特征可能不止一个维度(就像这里我们每个时刻是两个维度)
    return(k)

def getY(x):
    #生成观测值对应的Y
    Y=np.sin(x)*0.4+np.random.normal(0,0.05,size=x.shape)
    return(Y)

def guassian_process(X,X_star):
    K_XX=rbf(X,X)#f(X,X)
    K_XX_=rbf(X,X_star)#f(X,X*)
    K_X_X=rbf(X_star,X)#f(X*,X)
    K_X_X_=rbf(X_star,X_star)#f(X*,X*)
    
    K_XX_inv=np.linalg.inv(K_XX+ 1e-8 * np.eye(len(X)))
    #f(X,X)的逆,加后一项是为了防止不可逆
    
    mu_star=K_X_X.dot(K_XX_inv).dot(Y-0)+0
    #μ*  后面的μ(X*)也是0,是因为整体的μ(X)是0,去掉那几个点之后的μ(X*)也是0
    
    cov_star=K_X_X_-K_X_X.dot(K_XX_inv).dot(K_XX_)
    #Σ*
    
    return(mu_star,cov_star)

#根据观察点X,修正生成高斯过程新的均值和协方差


f,ax=plt.subplots(2, 1,
                  figsize=(10,10), 
                  sharex=True,
                  sharey=True)
#绘制高斯过程的先验 (μ(x)=0)
X_pre = np.arange(0, 10, 0.1)
Y_pre = np.array([0]*len(X_pre))

conv_pre=rbf(X_pre,X_pre)

uncertainty=1.96*np.sqrt(np.diag(conv_pre))
#1.96是高斯分布的95%置信区间,这里表示每个点对应的95%置信区间

ax[0].fill_between(
    X_pre,
    Y_pre+uncertainty,
    Y_pre-uncertainty,
    alpha=0.2)

ax[0].plot(X_pre,Y_pre,label="pre_expectation")
ax[0].legend()
#ax[0]绘制的是完全没有任何观测点的时候的先验概率分布,我们只知道μ(X)=0

X=np.array([1,3,7,9])
Y=getY(X)
#我们观测到了这四个点,其他的点μ(x)依旧为0
X_star=np.arange(0,10,0.1)
Y_star,conv_star=guassian_process(X,X_star)#得到 f(x*)|Y的均值和方差
uncertainty_star=1.96*np.sqrt(np.diag(conv_star))
ax[1].fill_between(
    X_star,
    Y_star+uncertainty_star,
    Y_star-uncertainty_star,
    alpha=0.2)
ax[1].plot(X_star,Y_star,label="after_expectation")
ax[1].scatter(X,Y,c='green')
ax[1].legend()
#ax[1]绘制的是有四个观测点之后的后验概率分布

 3.3.2 结论部分

         ax[0]绘制的是完全没有任何观测点的时候的先验概率分布,我们只知道μ(X)=0;ax[1]绘制的是有四个观测点之后的后验概率分布。

        明显可以看出,由于观测点信息的带入,连续域上各个点的均值发生了变化。同时大部分取值点的  置信空间也收窄,证明确定性得到了增强。

 参考内容:如何通俗易懂地介绍 Gaussian Process? - 知乎 (zhihu.com)

4 sklearn 

sklearn 笔记:高斯过程_UQI-LIUWJ的博客-CSDN博客

以上是关于机器学习笔记:高斯过程的主要内容,如果未能解决你的问题,请参考以下文章

机器学习笔记:高斯判别分析

ng机器学习视频笔记(十三) ——异常检测与高斯密度估计

斯坦福机器学习视频笔记 Week9 异常检测和高斯混合模型 Anomaly Detection

概率论笔记:高斯分布的条件概率

机器学习笔记EM算法及实践(以混合高斯模型(GMM)为例来次完整的EM)

聚类_七月算法4月机器学习班第10次课程笔记