作者:贾恩东
本文约2700字,建议阅读9分钟
本文将使用通俗易懂的语言引导读者入门高斯过程。
高斯过程(Gaussian Process)是机器学习中一个相当基础的概念,本文中笔者将使用通俗的语言让读者入门高斯过程。
高斯过程,顾名思义,包含了高斯分布(Gaussian Distribution)和随机过程(Stochastic Process)。简单来说,高斯过程是一个无限维的高斯分布。
无限维,对于未接触过随机过程的读者们来说可能还是难以理解,我们可以先从一维的高斯分布说起。
一维的高斯分布,即:对于一个随机变量 X 来说,如果其概率密度函数(probability density function, PDF)如下形式:
使用Normal 符号,简单记为:
那么这个一维变量X 就服从一维高斯分布,这个高斯分布里有两个参数,均值 和方差。
我们在下图中,展示了10个关于 X的采样,图中纵轴表示采样的值,横轴我们全部放在1的位置,表示这是从同一个变量中采样得到的。
import numpy as npimport matplotlib.pyplot as plt
n= 1 # 随机变量的维度n
m= 10 # 做了m次采样
# 这里简单假设所有维度是独立的# 且每个维度上的均值为0,标准差为1# 所以协方差矩阵是一个单位矩阵mean= np.zeros(n)
cov= np.eye(n)
# 得到随机变量的采样值
f_random= np.random.multivariate_normal(mean, cov, m).T
# 把不同维度的值分别指定到对应的横轴上去
Xshow= np.linspace(1, n, n).reshape(-1,1)
# 开始绘图
plt.figure(figsize=(12,8))
plt.plot(Xshow, f_random, 'x', linewidth=1, markersize=5, markeredgewidth=2)
plt.show()
图1
多维的高斯分布,或者说,多元高斯分布(multivariate gaussian distribution),则是对于一维高斯分布的一个扩展。对于N维变量 X 来说,它本身是一个N维向量,,因此它的参数不仅包括了每一个维度上的均值,还包括了每两个维度上的协方差。
这里为了示意,我们先简单画一个二元高斯分布的采样过程,而且我们先简单将这两个维度认为是独立的,即不同的维度协方差为0。如下图:
n= 2 # 随机变量的维度n
m= 10 # 做了m次采样
# 这里简单假设所有维度是独立的# 且每个维度上的均值为0,标准差为1# 所以协方差矩阵是一个单位矩阵
mean= np.zeros(n)
cov= np.eye(n)
# 得到随机变量的采样值
f_random= np.random.multivariate_normal(mean, cov, m).T
# 把不同维度的值分别指定到对应的横轴上去
Xshow= np.linspace(1, n, n).reshape(-1,1)
# 开始绘图
plt.figure(figsize=(12,8))
plt.plot(Xshow, f_random, 'x', linewidth=1, markersize=5, markeredgewidth=2)
plt.show()
如果进一步增加采样点,并且将概率直观的用直方图标记出来,大概是如下的感受。
如果我们继续增加维度N到3,4,...,看起来依然平平无奇,我们只是需要更多的均值和方差的参数需要事先指定(先验)。这里我们先不急拓展到无限维度,我们先想像这样一个场景。
班级里有10个学生,每个学生都参加了同一场考试。这些学生在同一场考试的得分刻画了这场考试的试卷难度。如果参加了第二场考试,依次类推...,我们把学生的数目当作采样次数,考试的种类当作随机变量的维度。那么上图就是10个学生在两场考试中的表现。
进一步,我们想观察同一个学生随不同考试的分数变化情况,我们做一个相邻维度的连接看看。
n = 2 # 考试次数n
m= 10 # m个学生
# 这里简单假设所有维度是独立的# 且每个维度上的均值为0,标准差为1# 所以协方差矩阵是一个单位矩阵mean = np.zeros(n)
cov = np.eye(n)
# 得到随机变量的采样值
f_random = np.random.multivariate_normal(mean, cov, m).T
# 把不同维度的值分别指定到对应的横轴上去
Xshow = np.linspace(1, n, n).reshape(-1,1)
# 开始绘图
plt.figure(figsize=(12,8))
plt.plot(Xshow, f_random, '-x', linewidth=1, markersize=5, markeredgewidth=2)
plt.show()
这时,我们增加考试的场数到7(n=7),继续观察。
感觉到哪里不对了吗? 如果仍然没有感觉,我们进一步增加考试的次数到30。
这下应该感觉了哪里不对劲了吧。
那就是这个图不符合常识,为什么?学生的考试分数完全没有规律,不同学生没有明显的分数差距。
这是因为我们事先做的不同维度独立的假设太理想,事实上时间前后相邻的不同维度是通常不独立的。
这里我们使用一种协方差函数(径向基函数,Radial Basis Function,这里先不用深究,只需要知道是帮我们生成一种常见先验协方差的用的)生成多元高斯分布来替代之前的不同维度独立的多元高斯分布。
如下图。
def kernel(a, b):sqdist = np.sum(a**2,axis=1).reshape(-1,1) + np.sum(b**2,1) - 2*np.dot(a, b.T)return np.exp(-0.5 * sqdist)n = 30 # 考试次数n
m= 10 # m个学生
# 这里假设所有维度不再独立# 每个维度上的均值为0# 协方差矩阵由kernel函数生成
mean = np.zeros(n)# 考虑数值的影响,重置横轴scale
Xshow = np.linspace(0, 1, n).reshape(-1,1)
cov = kernel(Xshow, Xshow)
# 得到随机变量的采样值
f_prior = np.random.multivariate_normal(mean, cov, m).T# 开始绘图
plt.figure(figsize=(12,8))for i in range(m):plt.plot(Xshow, f_prior, '-x', linewidth=1)plt.show()
这样看起来,有的学生分数在多数考试中均较低,有的学生分数在多数考试中均较高,还有持续进步和持续退步的学生。很合理!
这时候我们可以将维度推广到无限了。假如我们每一个时刻都有一个随机变量,当我们取连续的时刻(区别于之前的离散维度),就得到了无穷维度的高斯分布。值得注意的是,因为维度是无限的,对于所有维度,我们需要得到无穷多个先验的均值和一个无穷维度的协方差矩阵。但是为了简化这个描述,我们干脆使用函数来描述均值和协方差。
对于时刻t ,这个时刻的均值我们用函数取,称为均值函数,。
对于任意两个不同时刻t1和t2,这两个时刻上的协方差我们也用一个二元函数取,称为协方差函数或者核函数,cov(t1,t2 ) = k(t1,t2),之前用到的RBF函数是一种常用的核函数,形式为:
其中 和 l 是RBF函数的超参数。这个核函数看起来是合理的,因为当这两个不同时刻很接近时,这个协方差的值约大,相关性也就越大。
到这里我们对于高斯过程的简单介绍就结束了。
关于高斯过程的应用和其他领域相关之后有机会再给读者介绍。
编辑:黄继彦
欢迎留言,有机会与本文作者互动哦~
数据派研究部介绍
数据派研究部成立于2017年初,以兴趣为核心划分多个组别,各组既遵循研究部整体的知识分享和实践项目规划,又各具特色:
算法模型组:积极组队参加kaggle等比赛,原创手把手教系列文章;
调研分析组:通过专访等方式调研大数据的应用,探索数据产品之美;
系统平台组:追踪大数据&人工智能系统平台技术前沿,对话专家;
自然语言处理组:重于实践,积极参加比赛及策划各类文本分析项目;
制造业大数据组:秉工业强国之梦,产学研政结合,挖掘数据价值;
数据可视化组:将信息与艺术融合,探索数据之美,学用可视化讲故事;
网络爬虫组:爬取网络信息,配合其他各组开发创意项目。
点击文末“阅读原文”,报名数据派研究部志愿者,总有一组适合你~
转载须知
如需转载,请在开篇显著位置注明作者和出处(转自:数据派THUID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。
未经许可的转载以及改编者,我们将依法追究其法律责任。
点击“阅读原文”加入组织~