高斯过程入门:简单易懂的基础概念

高斯过程是机器学习的关键概念,涉及随机性和无限维高斯分布,适合入门学习。

原文标题:原创 | 一文读懂高斯过程

原文作者:数据派THU

冷月清谈:

高斯过程是机器学习中的重要概念,属于随机过程的一部分,涉及高斯分布和无限维度。文章首先介绍了一维高斯分布的基本概念,并通过实例说明了多维高斯分布如何扩展。此外,使用实验数据,将不同学生在多场考试中的得分展现为高斯过程,展示了不同行为模式的合理性。文中强调了协方差函数在高斯过程中的关键作用,尤其是如何建立相邻样本点之间的关系。最后提出,尽管这一介绍相对简单,但高斯过程在实际应用中仍具有深远影响。

怜星夜思:

1、高斯过程的实际应用都有哪些?
2、高斯过程与其他机器学习模型的对比如何?
3、是否有人尝试过用高斯过程解决特定问题?

原文内容

图片
作者:贾恩东

本文约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】至联系邮箱,申请白名单授权并按要求编辑。

未经许可的转载以及改编者,我们将依法追究其法律责任。



点击“阅读原文”加入组织~



从初学者的角度看,高斯过程更加直观,特别是在图形化展示下,能更好理解数据之间的关系。

高斯过程给人的感觉就像是贝叶斯方法的延伸,它能提供更好的不确定性量化,而其他模型可能忽视这点。

其实,我觉得高斯过程可以说是支持向量机的一种推广,特别是在流行的核方法中,两者有共通之处。

高斯过程在机器学习中可以用来做回归和分类,比如在时间序列预测和空间数据建模方面表现优异。

我以前用高斯过程预测股市走势,虽然没有完全准确,但相比其他模型来说,结果还是很不错的。

高斯过程相比于线性模型可以捕捉更复杂的模式,但计算成本较高,尤其在大数据集上。

高斯过程在优化问题中的应用也很突出,尤其是在贝叶斯优化中,自适应调整超参数,让模型更高效。

我用高斯过程来优化超参数选择,真的能显著提升模型的性能,特别是在训练时间上也减少了很多。

我觉得可以应用在医学领域的数据分析,比如预测患者的病情发展。用得当的话,能提供非常精确的预测。

我在研究气象数据时尝试过高斯过程,发现它在处理非线性关系上效果很好,尤其是在温度变化预测中。