1.7. 高斯过程(Gaussian Processes)
高斯过程(GP)是一种通用的监督学习方法,旨在解决回归和概率分类(probabilistic classification)问题。
高斯过程的优点:
- 预测值对观测值进行插值(至少对于常规内核(regular kernels)来说)。
- 该预测是概率形式的(高斯(Gaussian)),这样的话,可以计算得到经验置信区间(empirical confidence intervals)并且据此来判断是否需要修改(比如在线拟合,自适应拟合)一些感兴趣区域上的预测值。
- 通用性(Versatile):可以指定不同的内核(kernels)。 常见的内核都可以使用,但是也可以指定自定义内核。
高斯过程的缺点:
- 它不是稀疏的,即它使用整个样本/特征信息来进行预测。
- 它会在特征数量超过几十个的高维空间中失去运行效率。
1.7.1. 高斯过程回归(Gaussian Process Regression)(GPR)
GaussianProcessRegressor
类实现了用于回归问题的高斯过程(GP)模型。 为此,需要指定GP的先验(prior)。先验均值通常假定为常数或者零(当参数normalize_y=False
时); 当normalize_y=True
时,先验均值通常为训练数据的均值。而先验的方差通过传递内核(kernel)对象来指定。 通过参数optimizer
指定的优化器来最大化对数边缘似然估计(LML),内核的超参数可以在GaussianProcessRegressor的拟合过程中被优化。 优化器第一次运行的时候总是从一组初始的内核超参数上启动;后续的优化过程从被允许的合理取值范围内随机选择一组超参数开始优化。如果需要保持初始的超参值固定不变, 那么需要把优化器设置为None。
目标变量中的噪声级别通过参数alpha
来传递并指定,要么全局都是一个常量要么是每个数据点对应一个噪声点。 请注意,适度的噪声水平也可以有助于处理拟合期间的数值计算问题, 因为它被有效地实现为吉洪诺夫正则化(Tikhonov regularization), 即通过将其添加到核矩阵(kernel matrix)的对角线。 除了明确指定噪声水平,另外的替代方法是在内核中包含WhiteKernel分量(WhiteKernel component) , 这样可以从数据中估计全局噪声水平(见下面的示例)。
算法实现是基于RW2006的算法2.1 。除了标准scikit-learn估计器的API外,GaussianProcessRegressor:
- 允许预测,无需事先拟合(基于GP先验)
-
提供了另一种
sample_y(X)
方法,该方法可以评估在给定的情况下输入从GPR(先验或后验)提取的样本 -
提供了一种
log_marginal_likelihood(theta)
方法,该方法可以在外部使用其他方式选择超参数,例如通过马尔科夫链链蒙特卡罗(Markov chain Monte Carlo)。
1.7.2. GPR 案例
1.7.2.1. 带有噪声水平估计的GPR
该示例说明带有sum内核(sum-kernel)(包括WhiteKernel)的 GPR 可以估计数据的噪声水平。对数边缘似然(LML)的图示表明存在 LML 的两个局部最大值。
第一个对应于具有高噪声水平和较大长度尺度的模型,该模型解释了噪声中数据的所有变化。
第二个具有较小的噪声级别和较短的长度尺度,无噪声的函数关系解释了这种情况的大部分的变化。 第二种模型有较高的似然性(likelihood);然而,根据超参数的初始值,基于梯度的优化也可能会收敛到高噪声解。因此,对于不同的初始化,重复优化多次是很重要的。
1.7.2.2. GPR和KRR的比较
核岭回归(kernel ridge regression,KRR)和GPR都是通过在内部使用 “核技巧(kernel trick)” 来学习目标函数。KRR学习由相应内核诱导产生的空间中的线性函数,该函数对应于原始空间中的非线性函数。核诱导空间中的线性函数是基于带有岭正则化项的均方误差进行选择的。GPR使用内核来定义目标函数的先验分布的协方差,并使用观察到的训练数据来定义似然函数。基于贝叶斯定理,目标函数上的(高斯)后验分布就可以推导出来了,其平均值用于预测。
一个主要区别在于,GPR可以基于边缘似然函数中的梯度上升来选择内核的超参数,而KRR在交叉验证的损失函数(均方误差损失)上进行网格搜索来选择超参数。另一个不同之处是,GPR学习目标函数的生成概率模型,因此可以提供有意义的置信区间和后验样本以及预测,而KRR仅提供预测。
下图展示了KRR和GPR这两种方法在人造数据集上的表现,该人造数据集由正弦目标函数和强噪声组成。 该图比较了在此数据上学习到的基于ExpSineSquared内核的KRR和GPR模型,ExpSineSquared内核适用于学习周期函数,内核的超参数控制内核的平滑度(length_scale)和周期性(periodicity)。 此外,GPR 通过内核中附带的WhiteKernel分量(WhiteKernel component)l来显式学习数据的噪声水平;而 KRR 通过正则化参数 alpha 来显式学习数据的噪声水平。
该图显示两种方法都可以学习到目标函数的合理模型。GPR正确地将函数的周期性确定大致为2 ∗ π(6.28),而KRR却认为是两倍的周期4 ∗ π。除此之外,GPR还为预测提供了合理的置信区间,而KRR不能为预测提供置信区间。两种方法之间的主要区别是拟合和预测所需的时间:虽然原则上KRR的训练是更快的,但针对超参数优化的网格搜索会随着超参数的数量(“维数灾难”)而成倍增长。GPR中基于梯度的参数优化不受此指数增长的影响,因此在具有3维超参数空间的示例中,速度明显加快,但预测时间相似的。但是,生成GPR预测分布的方差需要的时间比仅预测其平均值要长。
1.7.2.3. GPR 算法在 Mauna Loa CO2 数据上的分析
该示例基于RW2006的第5.4.3节。它说明了使用梯度上升的对数边缘似然性的复杂内核工程和超参数优化的示例。数据包括从1958年到1997年间夏威夷在Mauna Loa天文台上收集的每月平均大气二氧化碳浓度(以百万分之几(ppmv)计)。目的是将二氧化碳浓度建模为时间t的函数。
内核由若干项(several terms)组成,负责说明信号的不同属性:
- RBF 内核解释一个长期平滑的上升趋势。具有较大长度尺寸的RBF内核将使该分量平滑;没有强制这种趋势正在上升,这给 GP 带来了可选择性。具体的长度尺度(length-scale)和振幅(amplitude)是超参数。
- 周期性的ExpSineSquared 内核解释季节性因素,固定周期为1年。该周期性分量的长度尺度(length-scale) 控制其平滑度,是一个自由参数。为了使其具备准确周期性的衰减,将ExpSineSquared内核(ExpSineSquared kernel)与RBF内核取乘积(product)。该RBF分量(component)的长度尺度(length-scale)控制衰减时间,并且是另一个自由参数。
- RationalQuadratic内核分量(kernel component)解释较小的中期不规则性 ,RationalQuadratic内核分量的长度尺度(length-scale)和alpha参数,决定着长度尺度的扩散性,这是将要被确定的参数。 根据RW2006,这些不规则性可以更好地由有理二次内核(RationalQuadratic kernel) 来解释, 而不是RBF内核分量(kernel component),这可能是因为它可以容纳若干个长度尺度(length-scale)。
- 由一个RBF内核组成噪声项,它将解释相关的噪声分量,如局部天气现象以及 WhiteKernel 对白噪声的贡献。 在这里, 相对幅度(relative amplitudes)和RBF的长度尺度(length scale)又是自由参数。
减去目标平均值后最大化对数边际似然(log-marginal-likelihood)产生下列内核,其中LML为-83.214:
34.4**2 * RBF(length_scale=41.8)
+ 3.27**2 * RBF(length_scale=180) * ExpSineSquared(length_scale=1.44,
periodicity=1)
+ 0.446**2 * RationalQuadratic(alpha=17.7, length_scale=0.957)
+ 0.197**2 * RBF(length_scale=0.138) + WhiteKernel(noise_level=0.0336)
因此,大多数目标信号(34.4ppm)可以通过长期上升趋势(长度范围为41.8年)来解释。周期分量的振幅为3.27ppm,衰减时间为180年,长度尺度为1.44。较长的衰减时间表明我们在本地具有非常接近周期性的季节性成分。相关噪声的幅度为0.197ppm,长度尺度为0.138年,白噪声贡献为0.197ppm。因此,总体噪声水平很小,表明该模型可以很好地解释数据。该图还显示,该模型直到2015年左右才能做出置信度比较高的预测。
1.7.3. 高斯过程分类器 (GPC)
GaussianProcessClassifier
将高斯过程(GP)用于分类,更具体地说是用于概率分类,即采用类概率的形式进行预测。 GaussianProcessClassifier 把一个GP先验(prior)放在隐函数(latent function)f上, 然后通过一个链接函数(link function) 来把其压缩来获得概率性分类(probabilistic classification)。隐函数f被称之为滋扰函数(nuisance function),其取值不可被观测,而且相互之间互不不相干。该函数的目的是为了方便地建立模型的,而且f在预测阶段就被去除了。GaussianProcessClassifier 实现了logistic链接函数,其积分不能被(解析地)计算,但是在二元分类的情况下很容易逼近。
与GP在回归问题中的设置相对比, 隐函数f的后验概率分布不是高斯分布,甚至对 GP 先验(prior)也不是,因为高斯似然函数(Gaussian likelihood)用于离散的类标签是不合适的。 所以,一个与logistic链接函数对应的非高斯似然(non-Gaussian likelihood)被用作隐函数f的后验概率分布。GaussianProcessClassifier使用基于拉普拉斯近似的高斯分布去逼近非高斯后验(non-Gaussian posterior)。 更多详情,请参见RW2006的第3章。
GP先验均值假定为零。通过传递内核对象来指定先验的协方差。通过由参数 optimizer
指定的优化器来最大化对数边缘似然估计(LML),内核的超参数可以在 GaussianProcessClassifier 的拟合过程中被优化。由于LML可能具有多个局部最优值,因此可以通过指定来n_restarts_optimizer
反复启动优化器。优化器第一次运行的时候总是从一组初始的内核超参数上启动;后续的优化过程从被允许的合理取值范围内随机选择一组超参数开始优化。如果需要保持初始的超参值固定不变,那么需要把优化器设置为 None 。
GaussianProcessClassifier
通过执行一对多(one-versus-rest)或一对一(one-versus-one)策略的进行训练和预测来支持多分类。在一对多(one-versus-rest)策略中,每个类都配有一个二元高斯过程分类器,其被训练为将该类与其余类分开。在一对一(one-versus-one)策略中,对每两个类拟合一个二元高斯过程分类器,其被训练为将这两个类分开。 最后,这些二元分类器的预测被组合成多类预测。更多详细信息,请参阅多分类章节。
在高斯过程分类的情况下,“一对一(one_vs_one)”可能在计算上更廉价,因为它必须解决涉及整个训练集的一个子集的许多问题,而不是解决整个数据集上较少的问题。由于高斯过程分类随着数据集的大小以立方形式缩放(scales cubically),因此这可能会更快。但是,请注意,“一对一(one_vs_one)”不支持预测概率估计,而仅支持简单的预测。此外,请注意GaussianProcessClassifier
在内部尚未实现真正的多类拉普拉斯近似(Laplace approximation),但是如上所述,该方法是基于在内部解决几个二进制分类任务的情况,这些任务的解决是使用“一对多(one-versus-rest)”或“一对一(one-versus-one)”组合的方式。
1.7.4. GPC 案列
1.7.4.1.使用 GPC 进行 概率化预测
这个案例展示了具有不同超参数选项的RBF内核的GPC预测概率。第一张图显示有任意选择的超参数的GPC的预测概率以及具有与最大LML对应的超参数 的GPC的预测概率。
虽然通过优化LML选择的超参数具有相当大的LML,但是根据测试数据上的对数损失,它们的表现更差。该图显示,这是因为它们在类边界表现出类概率的急剧变化(这是好的表现),但在远离类边界的地方其预测概率却接近0.5(这是坏的表现) 这种不良影响是由于GPC内部使用了拉普拉斯近似(Laplace approximation)。
第二张图显示了针对内核超参数的不同选择所对应的LML(对数边缘似然),并用黑点突出显示了第一个图中使用的超参数的两个选择。
1.7.4.2. GPC分类器在异或问题上的应用
本案例展示了将GPC用于异或数据。参与比较试验的是平稳的各向同性的内核(RBF
)和非平稳的内核(DotProduct
)。在这个特定的数据集上,由于DotProduct
的边界是线性的并且与坐标轴重合,因此该内核获得了更好的结果。但是,在实践中固定的内核RBF
通常会获得更好的结果。
1.7.4.3. GPC分类器在鸢尾属植物数据集(iris dataset)上的应用
该案例展示了在鸢尾属植物数据集的二维版本上,各向同性和各向异性RBF核的GPC的预测概率。这说明了GPC对多类分类的适用性。各向异性RBF内核通过为两个特征维度分配不同的长度尺度(length-scales)来获得稍高的LML(log-marginal-likelihood)。
1.7.5. 用于高斯过程的内核
内核(在GPs中也可以叫做 ”协方差函数”) 是决定GP的先验形状和后验形状的关键组成部分。它们通过定义两个数据点的“相似性”,并结合相似的数据点应该具有相似的目标值的假设,对所学习的函数进行编码。内核可以分为两类:平稳内核(stationary kernels),只取决于两个数据点的距离,不依赖于它们的绝对值k(x_i, x_j)= k(d(x_i, x_j)),因此它们对输入空间中的平移是不变的;非平稳内核(non-stationary kernels),取决于数据点的具体值。平稳内核可以进一步细分为各向同性(isotropic)和各向异性(anisotropic)内核,其中各向同性内核对输入空间中的旋转具有不变性。有关更多详细信息,请参阅[RW2006]的第4章。
1.7.5.1. 高斯过程内核的API
Kernel
主要用来计算数据点之间的高斯过程的协方差。内核中 __call__
方法会被调用。 该方法即可以用于计算2d数组X中所有数据点对的“自协方差(auto-covariance)”, 也可以计算2d数组X中的数据点与2d数组Y中的数据点的所有组合的“互协方差(cross-covariance)”。以下等式对于所有内核 k(除了WhiteKernel
)都是成立的:k(X) == K(X, Y=X)
如果仅仅是自协方差的对角线元素被使用,那么内核的 diag()
方法将会被调用, 该方法比调用 __call__
: np.diag(k(X, X)) == k.diag(X)
(调用效果是一样)具有更高的计算效率。
内核通过超参数向量θ进行参数化。这些超参数可以控制例如内核的长度尺度(length-scales)或周期性(periodicity)(见下文)。通过设置 __call__
方法的参数 eval_gradient=True
,来使得所有的内核都支持计算自协方差对于θ的解析梯度。 该梯度被用来在(回归型和分类型的)高斯过程中计算LML(对数边缘似然)函数的梯度,进而被用来通过梯度上升的方法极大化LML(对数边缘似然)函数, 从而确定θ的值。对于每个超参数,当创建内核的实例时,初始值和边界值需要被指定。θ的当前值可以通过内核对象属性 theta
设置或者获取。更重要的是,超参数的边界值可以由内核属性 bounds
获取。需要注意的是, 以上两种属性值(theta和bounds)都会返回内部使用值的对数转换值(log-transformed values),这是因为这两种属性值通常更适合基于梯度的优化。 每个超参数的规格(specification)以 Hyperparameter
的实例的形式被存储在相应内核中。请注意使用了以”x”命名的超参的内核必然具有 self.x 和 self.x_bounds 这两种属性。
所有内核的抽象基类是Kernel
。内核实现类似的接口Estimator
,该接口提供get_params()
,set_params()
和clone()
方法。这样的实现方法也允许通过元估计器(meta-estimators)诸如管道(Pipeline)
or 网格搜索(GridSearch)
来设置内核的值。注意,由于内核的嵌套结构(通过应用内核算子(kernel operators),如下所见),内核参数的名称可能会变得相对复杂些。通常来说,对于二元内核算子,左运算元的参数以k1__
为前缀,而右运算元以k2__
为前缀。另一个方便的方法是clone_with_theta(theta)
,该方法返回克隆版本的内核,但是超参数设置为theta
。示例如下:
>>> 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) # 注意: 该值经过log变换(log-transformed)
[ 0. -0.69314718 0.69314718]
>>> print(kernel.bounds) # 注意: 该值经过log变换(log-transformed)
[[ -inf 2.30258509]
[ -inf 2.30258509]
[ -inf 2.30258509]]
所有高斯过程内核都可以与sklearn.metrics.pairwise
进行互操作,反之亦然:Kernel
的子类实例可以通过metric
参数传给 sklearn.metrics.pairwise
中的pairwise_kernels
。此外,来自 pairwise 的核函数可以通过封装类PairwiseKernel
被用作 GP 内核。唯一的警告是,超参数的梯度不是解析的(analytic),而是数值的(numeric),并且所有这些内核只支持各向同性距离(isotropic distances)。 参数gamma
被认为是一个超参数,可以进行优化。其他内核参数在初始化时直接设置,并保持固定。
1.7.5.2. 基本内核函数
ConstantKernel
内核可以作为Product
中的一个组成部分,在其中,它缩放其他因子(内核)的量级;也可以作为Sum
的一部分,在其中,它修改高斯过程的均值。这取决于参数constantValue(constant_value)的设置。该方法定义为:
k(x_i, x_j) = constantValue \;\forall\; x_1, x_2
WhiteKernel
内核的主要使用情景是作为sum内核(sum-kernel)的一部分,它在其中解释信号的噪声成分(noise-component)。可以通过调节参数noiseLevel(noise_level)来设置其估计噪声水平。它被定义如下:
k(x_i, x_j) = noiseLevel \text{ if } x_i == x_j \text{ else } 0
1.7.5.3. 核算子(Kernel operators)
内核算子(Kernel operators)接受一到两个基本内核并将它们组合起来变成一个新核。 内核类Sum
接受两个内核k1和k2,并通过k_{sum}(X, Y) = k1(X, Y) + k2(X, Y)把它们组合起来。 内核类 Product
接受两个内核k1和k2,并通过k_{product}(X, Y) = k1(X, Y) * k2(X, Y)把它们组合起来。内核类Exponentiation
接受一个基本核和一个标量参数 exponent,并通过k_{exp}(X, Y) = k(X, Y)^\text{exponent}把它们组合起来。
1.7.5.4. 基于径向基函数 (RBF)的内核
RBF
内核是一个平稳核(stationary kernel)。它也被称为“平方指数(squared exponential)”内核。它可以通过长度尺度参数(length-scale)l > 0来实现参数化。该参数既可以是标量(内核的各向同性变体) 或者是与输入x具有相同维数的向量(内核的各向异性变体) 。该内核可以被定义为:
k(x_i, x_j) = \text{exp}\left(-\frac{1}{2} d(x_i / l, x_j / l)^2\right)
该内核是无限可微分的,这暗含着带有此核的GPs作为协方差函数具有所有阶的平均平方导数, 并且因此非常平滑。由RBF核产生的GP的先验与后验(prior and posterior)在下图中展示:
1.7.5.5. Matérn 内核
Matern
内核是一个平稳内核(stationary kernel),它是RBF
内核的一般化。它有一个附加的参数\nu,该参数控制结果函数的平滑程度。它由长度尺度参数(length-scale)l > 0来实现参数化。该参数既可以是标量(内核的各向同性变体)或者是与输入x具有相同维数的向量(内核的各向异性变体) 。该内核可以被定义为:
k(x_i, x_j) = \sigma^2\frac{1}{\Gamma(\nu)2^{\nu-1}}\Bigg(\gamma\sqrt{2\nu} d(x_i / l, x_j / l)\Bigg)^\nu K_\nu\Bigg(\gamma\sqrt{2\nu} d(x_i / l, x_j / l)\Bigg),
由于\nu\rightarrow\infty, Matérn 内核收敛到RBF 内核。 当\nu = 1/2时, Matérn 内核变得与绝对指数核(absolute exponential kernel)一模一样,即:
k(x_i, x_j) = \sigma^2 \exp \Bigg(-\gamma d(x_i / l, x_j / l) \Bigg) \quad \quad \nu= \tfrac{1}{2}
尤其是,当\nu = 3/2:
k(x_i, x_j) = \sigma^2 \Bigg(1 + \gamma \sqrt{3} d(x_i / l, x_j / l)\Bigg) \exp \Bigg(-\gamma \sqrt{3}d(x_i / l, x_j / l) \Bigg) \quad \quad \nu= \tfrac{3}{2}
和 \nu = 5/2:
k(x_i, x_j) = \sigma^2 \Bigg(1 + \gamma \sqrt{5}d(x_i / l, x_j / l) +\frac{5}{3} \gamma^2d(x_i / l, x_j / l)^2 \Bigg) \exp \Bigg(-\gamma \sqrt{5}d(x_i / l, x_j / l) \Bigg) \quad \quad \nu= \tfrac{5}{2}
是不无限可微的(由RBF kernel假定)但至少一阶可微(\nu = 3/2)或二阶可微(\nu = 5/2)用来学习函数是常用选择。
通过\nu灵活控制学习函数的平滑性可以更加适应真正的底层函数的关联属性。 通过Matérn内核产生的GP的先验和后验如下图所示:
有关Matérn内核的不同变体的更多详细信息,请参见RW2006,pp84。
1.7.5.6. 有理二次内核(Rational quadratic kernel)
RationalQuadratic
内核可以看作是不同特征尺度下的RBF
内核的规模混合(一个无穷和) ,它通过长度尺度参数(length-scales)l > 0和比例混合参数α > 0进行参数化。当前仅支持各向同性变体(其中l是标量)。内核公式如下:
k(x_i, x_j) = \left(1 + \frac{d(x_i, x_j)^2}{2\alpha l^2}\right)^{-\alpha}
下图显示了由RationalQuadratic
内核产生的GP的先验和后验:
1.7.5.7. 指数正弦平方内核(Exp-Sine-Squared kernel)
ExpSineSquared
内核允许用来对周期性函数(periodic functions)进行建模。 它通过长度尺度(length-scale)参数l > 0和 周期性(periodicity)参数p > 0进行参数化。 当前仅支持各向同性变体(其中l是标量)。内核公式如下:
k(x_i, x_j) = \text{exp}\left(-2 \left(\text{sin}(\pi / p * d(x_i, x_j)) / l\right)^2\right)
下图显示了由ExpSineSquared内核产生的GP的先验和后验:
1.7.5.8. 点乘内核(Dot-Product kernel)
DotProduct
内核是一个非平稳核(non-stationary kernel) ,该内核可以从线性回归中得到,而线性回归又是通过把 N(0,1)先验放在x_d (d = 1, . . . , D)的系数上,以及把N(0, \sigma_0^2)先验放在偏置上得到的。DotProduct
内核关于原点的坐标旋转是具有不变性的,但是它没有平移不变性。它通过参数\sigma_0^2进行参数化。对于\sigma_0^2 = 0,该内核又叫做齐次线性核(homogeneous linear kernel), 否则它就是非齐次的(inhomogeneous)。 该内核的定义如下:
k(x_i, x_j) = \sigma_0 ^ 2 + x_i \cdot x_j
DotProduct
内核通常与指数(exponentiation)组合。下图显示了一个指数为2的示例:
1.7.5.9. 参考资料
Carl Eduard Rasmussen and Christopher K.I. Williams, “Gaussian Processes for Machine Learning”, MIT Press 2006, 点击这个链接here来获取这本书的正式完整的PDF版本。
©2007-2019,scikit-learn开发人员(BSD许可证)。 显示此页面源
未经允许不得转载:PythonOK » 1.7. 高斯过程(Gaussian Processes)