页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

高斯过程(GP)是一种通用的监督学习方法,旨在解决回归概率分类问题。

高斯过程的优点是:

  • 预测内插了观察结果(至少对于常规内核)。预测内插了观察结果(至少对于正则核)。
  • 预测是概率(Gaussian),所以人们可以计算经验置信区间,并根据那些应该在某些兴趣区域改编(在线拟合,自适应)预测的那些来确定。
  • 通用性:可以指定不同的内核。提供通用内核,但也可以指定自定义内核。

高斯过程的缺点包括:

  • 它们不稀疏,即他们使用整个样本/特征信息来执行预测。
  • 它们在高维空间中失去效率 - 即当功能数量超过几十个时。
 

高斯过程回归(GPR)

GaussianProcessRegressor工具高斯过程(GP)回归的目的。为此,需要指定GP的先前。假设先前的均值为常数,零(normalize_y=False或)训练数据的平均值(for normalize_y=True)。先前的协方差是通过传递内核对象来指定的。在通过最大化基于传递的对数边缘似然(LML)的GaussianProcessRegressor拟合期间,优化内核的超参数optimizer。由于LML可能具有多个局部最优值,所以优化器可以通过指定重复启动n_restarts_optimizer。第一次运行始终从内核的初始超参数值开始执行; 从已经从允许值的范围中随机选择的超参数值进行后续运行。

可以通过参数传递目标中的噪声级别alpha,全局为标量或每数据点。请注意,适度的噪声水平也可以有助于处理拟合期间的数字问题,因为它被有效地实现为Tikhonov正则化,即通过将其添加到核心矩阵的对角线。明确指定噪声水平的替代方法是将WhiteKernel组件包含在内核中,这可以从数据中估计全局噪声电平(见下面的示例)。

实现基于[RW2006]的算法2.1。除了标准scikit学习估计器的API之外,GaussianProcessRegressor:

  • 允许预测,无需事先拟合(基于GP之前)
  • 提供了一种额外的方法sample_y(X),其评估在给定输入处从GPR(先验或后验)绘制的样本
  • 公开了一种方法log_marginal_likelihood(theta),可以在外部使用其他方式选择超参数,例如通过马尔科夫链蒙特卡罗链。

 

GPR示例

GPR和内核岭回归的比较

内核脊回归(KRR)和GPR通过内部使用“内核技巧”来学习目标函数。KRR学习由相应内核引起的空间中的线性函数,该空间对应于原始空间中的非线性函数。基于平均误差损失与脊正弦化,选择内核空间中的线性函数。GPR使用内核来定义先验分布在目标函数上的协方差,并使用观察到的训练数据来定义似然函数。基于贝叶斯定理,定义了目标函数上的(高斯)后验分布,其平均值用于预测。

一个主要区别是,GPR可以基于边际似然函数上的梯度上升选择内核的超参数,而KRR需要在交叉验证的损失函数(均方误差损失)上执行网格搜索。另一个区别是,GPR学习目标函数的生成概率模型,因此可以提供有意义的置信区间和后验样本以及预测值,而KRR仅提供预测。

下图说明了人造数据集上的两种方法,其中包括正弦目标函数和强噪声。该图比较了基于ExpSineSquared内核的KRR和GPR的学习模型,适用于学习周期函数。内核的超参数控制内核的平滑度(length_scale)和周期性(周期性)。此外,数据的噪声水平由GPR通过内核中的另外的WhiteKernel组件和KRR的正则化参数α明确地学习。

该图显示,两种方法都可以学习合理的目标函数模型。GPR将功能的周期性正确地识别为(6.28),而KRR选择倍增的周期 。此外,GPR为KRR不可用的预测提供了合理的置信区间。两种方法之间的主要区别是拟合和预测所需的时间:原则上KRR的拟合速度较快,超参数优化的网格搜索与超参数(“维度诅咒”)呈指数级关系。GPR中的参数的基于梯度的优化不受此指数缩放的影响,因此在具有三维超参数空间的该示例上相当快。预测的时间是相似的; 然而,

Mauna Loa CO2数据中的

该示例基于[RW2006]的第5.4.3节。它演示了使用梯度上升的对数边缘似然性的复杂内核工程和超参数优化的示例。数据包括在1958年至1997年间夏威夷Mauna Loa天文台收集的每月平均大气二氧化碳浓度(以百万分之几(ppmv)计)。目的是将二氧化碳浓度建模为时间t的函数。

内核由几个术语组成,负责说明信号的不同属性:

在减去目标平均值后最大化对数边际似然率产生下列内核:LML为-83.214:

因此,大多数目标信号(34.4ppm)由长期上升趋势(长度为41.8年)解释。周期分量的振幅为3.27ppm,衰减时间为180年,长度为1.44。长时间的衰变时间表明我们在当地非常接近周期性的季节性成分。相关噪声的幅度为0.197ppm,长度为0.138年,白噪声贡献为0.197ppm。因此,整体噪声水平非常小,表明该模型可以很好地解释数据。该图还显示,该模型直到2015年左右才能做出非常有信心的预测

高斯过程分类(GPC)

所述GaussianProcessClassifier器具高斯过程(GP)用于分类目的,更具体地用于概率分类,其中测试的预测采取类概率的形式。GaussianProcessClassifier将GP置于潜在函数之前F,然后通过链接函数进行压缩以获得概率分类。潜在的功能F是所谓的滋扰功能,其值没有被观察到,并且与它们本身无关。其目的是允许模型的方便配方,并F 在预测期间被去除(整合)。GaussianProcessClassifier实现了逻辑链路功能,对于该逻辑,积分不能在分析上计算,但在二进制情况下很容易近似。

与回归设置相反,F即使对于GP ,潜在函数的后验 也不是高斯,因为高斯似然不适用于离散类标签。相反,使用与逻辑链路功能(logit)对应的非高斯似然。GaussianProcessClassifier基于拉普拉斯近似近似非高斯后的高斯。有关详细信息,请参见[RW2006]的第3章。

GP先验平均值假定为零。先前的协方差是通过传递内核对象来指定的。在通过最大化基于传递的对数边缘似然(LML)的GaussianProcessRegressor拟合期间,优化内核的超参数optimizer。由于LML可能具有多个局部最优值,所以优化器可以通过指定重复启动n_restarts_optimizer。第一次运行始终从内核的初始超参数值开始执行; 从已经从允许值的范围中随机选择的超参数值进行后续运行。如果初始超参数应该保持固定,可以作为优化传递。

GaussianProcessClassifier通过执行一对一或一对一的训练和预测来支持多类分类。在一对一休息中,每个类都配有一个二进制高斯过程分类器,该类别被训练为将该类与其余类分开。在“one_vs_one”中,对于每对类拟合一个二进制高斯过程分类器,这被训练为分离这两个类。这些二进制预测因子的预测被组合成多类预测。有关详细信息,请参阅多类别分类

在高斯过程分类的情况下,“one_vs_one”可能在计算上更便宜,因为它必须解决涉及整个训练集的仅一个子集的许多问题,而不是整个数据集的较少的问题。由于高斯过程分类与数据集的大小相互立方,这可能要快得多。但是,请注意,“one_vs_one”不支持预测概率估计,而只是简单的预测。此外,请注意,GaussianProcessClassifier在内部还没有实现真正的多类Laplace近似,但如上所述,基于在内部解决几个二进制分类任务,它们使用一对一或一对一组合。

 

高斯过程的内核

内核(在GP的背景下也称为协方差函数)是确定GP前后形状的GP的关键组成部分。他们通过定义两个数据点的“相似性”,并结合相似的数据点应该具有相似的目标值的假设,对所学习的函数进行编码。可以区分两类内核:固定内核只取决于两个数据点的距离,而不是依赖于它们的绝对值,因此它们对于输入空间中的转换是不变的,而非固定的内核也取决于数据点的具体值。固定内核可以进一步细分为各向同性和各向异性内核,其中各向同性内核也不会在输入空间中旋转。更多细节,

高斯过程内核API 

a的主要用法Kernel是计算GP在数据点之间的协方差。为此,__call__可以调用内核的方法。该方法可以用于计算2d阵列X中所有数据点对的“自动协方差”,或二维阵列X的数据点与二维阵列Y中的数据点的所有组合的“互协方差”。以下身份对于所有内核k都是正确的(除了WhiteKernel): k(X) == K(X, Y=X)

如果仅使用自动协方差的对角线,diag() 则可以调用内核的方法,该方法比等效调用的计算效率更高__call__np.diag(k(X, X)) == k.diag(X)

内核通过超参数向量参数化。这些超参数可以例如控制内核的长度尺度或周期性(见下文)。内核的自协方差对于所有的内核支持计算解析梯度通过设置 eval_gradient=True__call__方法。高斯过程(回归和分类器)都使用这种梯度来计算对数边缘似然的梯度,后者又用于通过梯度上升来确定最大化对数边缘似然的值。对于每个超参数,在创建内核实例时需要指定初始值和边界。可以通过theta内核对象的属性获取和设置 当前值。此外,bounds超参数的范围可以通过内核的属性来访问。请注意,这两个属性(theta和bounds)都会返回内部使用值的日志转换值,因为这些值通常更适合基于梯度的优化。每个超级参数的规范Hyperparameter以相应内核中的实例的形式存储 。请注意,使用名称为“x”的超参数的内核必须具有self.x和self.x_bounds属性。每个超级参数的规范以相应内核中的实例的形式存储。请注意,使用名称为“x”的超参数的内核必须具有self.x和self.x_bounds属性。每个超级参数的规范以相应内核中的实例的形式存储。请注意,使用名称为“x”的超参数的内核必须具有self.x和self.x_bounds属性。

所有内核的抽象基类是Kernel。内核实现类似的接口Estimator,提供方法get_params(), set_params()clone()。这也允许通过诸如Pipeline或者之类的元估计来设置内核值GridSearch。请注意,由于内核的嵌套结构(通过应用内核操作符,请参见下文),内核参数的名称可能会变得相对复杂。一般来说,对于二进制内核运算符,左操作数的k1__ 参数与右操作数的参数前缀k2__。一个额外的便利方法是clone_with_theta(theta)返回克隆版本的内核,但是超参数设置为theta。一个说明性例子:

代码块
languagepy
>>> from sklearn.gaussian_process.kernels import ConstantKernel, RBF
>>> kernel = ConstantKernel(constant_value=1.0, constant_value_bounds=(0.0, 10.0)) * RBF(length_scale=0.5, length_scale_bounds=(0.0, 10.0)) + RBF(length_scale=2.0, length_scale_bounds=(0.0, 10.0))
>>> for hyperparameter in kernel.hyperparameters: print(hyperparameter)
Hyperparameter(name='k1__k1__constant_value', value_type='numeric', bounds=array([[  0.,  10.]]), n_elements=1, fixed=False)
Hyperparameter(name='k1__k2__length_scale', value_type='numeric', bounds=array([[  0.,  10.]]), n_elements=1, fixed=False)
Hyperparameter(name='k2__length_scale', value_type='numeric', bounds=array([[  0.,  10.]]), n_elements=1, fixed=False)
>>> params = kernel.get_params()
>>> for key in sorted(params): print("%s : %s" % (key, params[key]))
k1 : 1**2 * RBF(length_scale=0.5)
k1__k1 : 1**2
k1__k1__constant_value : 1.0
k1__k1__constant_value_bounds : (0.0, 10.0)
k1__k2 : RBF(length_scale=0.5)
k1__k2__length_scale : 0.5
k1__k2__length_scale_bounds : (0.0, 10.0)
k2 : RBF(length_scale=2)
k2__length_scale : 2.0
k2__length_scale_bounds : (0.0, 10.0)
>>> print(kernel.theta)  # Note: log-transformed
[ 0.         -0.69314718  0.69314718]
>>> print(kernel.bounds)  # Note: log-transformed
[[       -inf  2.30258509]
 [       -inf  2.30258509]
 [       -inf  2.30258509]]

 

所有的Gaussian进程内核都可以互操作,sklearn.metrics.pairwise 反之亦然:Kernel可以传递 metric对于pairwise_kernels`` 的子类的实例sklearn.metrics.pairwise。此外,使用包装类可以将来自成对的内核函数用作GP内核PairwiseKernel。唯一需要注意的是,超参数的梯度不是分析的,而是数字,所有这些内核只支持各向同性距离。该参数gamma被认为是一个超参数,可以进行优化。其他内核参数在初始化时直接设置,并保持固定。

基本内核

ConstantKernel内核可以作为一个组成部分Product ,其中它缩放其他因子(内核)的大小或作为一部分内核Sum的内核,其中它修改高斯过程的平均值。这取决于一个参数。它被定义为:

WhiteKernel内核的主要用例是作为和内核的一部分,它解释了信号的噪声分量。调整其参数对应于估计噪声水平。它被定义为:e

内核运算符

内核运算符采用一个或两个基本内核,并将它们组合成一个新的内核。该Sum内核采用两个内核K1K2 ,并通过将它们组合。该 Product内核采用两个内核K1K2 ,并通过将它们组合。该Exponentiation内核采用一个基本内核和一个标量参数 指数,并通过将它们组合 

径向基函数(RBF)内核

RBF内核是一个固定的内核。它也被称为“平方指数”内核。它由参数化参数,它可以是标量(内核的各向同性变体)或与输入X(内核的各向异性变体)具有相同数量的维度的向量。内核由以下给出:

这个内核是无限可微的,这意味着这个内核作为协方差函数的GP具有所有阶数的均方差导数,因此非常平滑。由RBF内核产生的GP的先前和后面如下图所示:

Matérn内核

Matern内核是一个固定的内核和的推广 RBF内核。它有一个额外的参数来控制所得到的函数的平滑度。它由参数化参数,它可以是标量(内核的各向同性变体)或与输入X(内核的各向异性变体)具有相同数量的维度的向量。内核由以下给出:

因为,Matérn内核收敛到RBF内核。当Matérn内核变得与绝对指数内核相同时,即,

特别是

是不是无限可微性(由RBF内核假定)的学习功能的流行选择,但至少一次()或两次可微分()。

控制学习功能的平滑度的灵活性 允许适应真正的底层功能关系的属性。由Matérn内核生成的GP的先前和后面如下图所示:

有关Matérn内核的不同变体的更多详细信息,请参见[RW2006] pp84。

理性二次内核

RationalQuadratic内核可以被看作是一个比例混合物(无限总和)RBF具有不同的特征长度尺度的内核。它通过长度尺度参数和比例混合参数进行参数化。此时  仅升支持标量的各向同性变量。内核由以下给出:

由RBF内核产生的GP的先前和后面如下图所示:

正弦平方内核

ExpSineSquared内核允许造型周期函数。它通过长度尺度参数和周期性参数进行参数化 。此时仅升支持标量的各向同性变体。内核由以下给出:

由ExpSineSquared内核产生的GP的先前和后面如下图所示:

Dot-Product内核

DotProduct内核是非平稳,并且可以从线性回归通过将获得先验上的系数和先前的上偏置。该DotProduct内核是不变的关于原点的坐标,而不是翻译的旋转。它由参数参数化。因此,内核称为均匀线性内核,否则它是不均匀的。内核是由

DotProduct内核通常与幂组合。指数2的一个例子如下图所示:

参考

  • [RW2006] 机器学习高斯过程,卡尔·爱德华·拉斯穆森和克里斯托弗·威廉姆斯KI,麻省理工学院出版社2006年链接到这本书的正式完整的PDF版本 在这里

 

传统高斯过程

在本节中,描述了在scikit学习中使用的高斯过程的实现,直到版本0.16.1。请注意,此实现已被弃用,将在版本0.18中删除。

介绍回归实例

说我们要代替这个功能。为了做到这一点,该功能被评估到一个实验设计上。然后,我们定义一个GaussianProcess模型,其回归和相关模型可以使用附加的kwargs来指定,并要求模型拟合数据。根据在实例化过程中提供的参数数量,拟合过程可以利用参数的最大似然估计,或者使用给定的参数。

代码块
languagepy
>>> import numpy as np
>>> from sklearn import gaussian_process
>>> def f(x):
...     return x * np.sin(x)
>>> X = np.atleast_2d([1., 3., 5., 6., 7., 8.]).T
>>> y = f(X).ravel()
>>> x = np.atleast_2d(np.linspace(0, 10, 1000)).T
>>> gp = gaussian_process.GaussianProcess(theta0=1e-2, thetaL=1e-4, thetaU=1e-1)
>>> gp.fit(X, y)  
GaussianProcess(beta0=None, corr=<function squared_exponential at 0x...>,
        normalize=True, nugget=array(2.22...-15),
        optimizer='fmin_cobyla', random_start=1, random_state=...
        regr=<function constant at 0x...>, storage_mode='full',
        theta0=array([[ 0.01]]), thetaL=array([[ 0.0001]]),
        thetaU=array([[ 0.1]]), verbose=False)
>>> y_pred, sigma2_pred = gp.predict(x, eval_MSE=True)

装配噪声数据

当要拟合的数据包含噪声时,可以通过指定每个点的噪声方差来使用高斯过程模型。 GaussianProcess将参数nugget加到训练点之间的相关矩阵的对角线上:一般来说,这是一种Tikhonov正则化。在平方指数相关函数的特殊情况下,该归一化等效于指定输入中的小数方差。那是

使用nuggetcorr正确设置高斯处理可以用于从噪声数据强大地恢复底层函数。

数学公式

经验最佳线性无偏估计(EBLUP)

到现在为止,假设给出了自相关和回归模型。然而,在实践中,它们从来不是提前知道的,所以必须为这些模型做出(积极的)经验选择相关模型

提供这些选择,应该估计BLUP中涉及的剩余未知参数。为此,人们使用一组提供的观察结合一些推理技术。基于DACE的Matlab工具箱的本实现使用最大似然估计技术 - 参见完整方程式的DACE手册。这种最大似然估计问题在自相关参数中变成全局优化问题。在本实施中,通过来自scipy.optimize的fmin_cobyla优化函数来解决这个全局优化。然而,在各向异性的情况下,我们提供了Welch的分量优化算法的实现 - 参见参考。

实现细节

该实现基于DACE Matlab工具箱的翻译。

参考文献:

  • DACE,A Matlab Kriging Toolbox S Lophaven,HB Nielsen,J Sondergaard 2002,
  • WJ Welch,RJ Buck,J. Sacks,HP Wynn,TJ Mitchell和MD Morris(1992)。筛选,预测和计算机实验。Technometrics,34(1)15-25。