# 1.7. 高斯過程
校驗者:
[@glassy](https://github.com/apachecn/scikit-learn-doc-zh)
[@Trembleguy](https://github.com/apachecn/scikit-learn-doc-zh)
翻譯者:
[@AI追尋者](https://github.com/apachecn/scikit-learn-doc-zh)
**高斯過程 (GP)** 是一種常用的監督學習方法,旨在解決\*回歸問題\*和\*概率分類問題\*。
高斯過程模型的優點如下:
> - 預測內插了觀察結果(至少對于正則核)。
> - 預測結果是概率形式的(高斯形式的)。這樣的話,人們可以計算得到經驗置信區間并且據此來判斷是否需要修改(在線擬合,自適應)
>
> 在一些區域的預測值。
> - 通用性: 可以指定不同的:ref:內核(kernels)<gp\_kernels>。雖然該函數提供了常用的內核,但是也可以指定自定義內核。
高斯過程模型的缺點包括:
> - 它們不稀疏,例如,模型通常使用整個樣本/特征信息來進行預測。
> - 高維空間模型會失效,高維也就是指特征的數量超過幾十個。
## 1.7.1. 高斯過程回歸(GPR)
[`GaussianProcessRegressor`](generated/sklearn.gaussian_process.GaussianProcessRegressor.html#sklearn.gaussian_process.GaussianProcessRegressor "sklearn.gaussian_process.GaussianProcessRegressor") 類實現了回歸情況下的高斯過程(GP)模型。 為此,需要實現指定GP的先驗。當參數 `normalize_y=False` 時,先驗的均值 通常假定為常數或者零; 當 `normalize_y=True` 時,先驗均值通常為訓練數 據的均值。而先驗的方差通過傳遞 [內核(kernel)](#gp-kernels) 對象來指定。通過 最大化基于傳遞 `optimizer` 的對數邊緣似然估計(LML),內核的超參可以在 GaussianProcessRegressor 類執行擬合過程中被優化。由于 LML 可能會存在多個 局部最優解,因此優化過程可以通過指定 `n_restarts_optimizer` 參數進行 多次重復。通過設置內核的超參初始值來進行第一次優化的運行。后續的運行 過程中超參值都是從合理范圍值中隨機選取的。如果需要保持初始化超參值, 那么需要把優化器設置為 None 。
目標變量中的噪聲級別通過參數 `alpha` 來傳遞并指定,要么全局是常數要么是一個數據點。 請注意,適度的噪聲水平也可以有助于處理擬合期間的數字問題,因為它被有效地實現為吉洪諾夫正則化(Tikhonov regularization), 即通過將其添加到核心矩陣的對角線。明確指定噪聲水平的替代方法是將 WhiteKernel 組件包含在內核中, 這可以從數據中估計全局噪聲水平(見下面的示例)。
算法實現是基于 [\[RW2006\]](#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 估計
該示例說明具有包含 WhiteKernel 的和核(sum-kernel)的 GPR 可以估計數據的噪聲水平。 對數邊緣似然(LML)景觀的圖示表明存在 LML 的兩個局部最大值。
[](../auto_examples/gaussian_process/plot_gpr_noisy.html)
第一個對應于具有高噪聲電平和大長度尺度的模型,其解釋數據中噪聲的所有變化。
[](../auto_examples/gaussian_process/plot_gpr_noisy.html)
第二個具有較小的噪聲水平和較短的長度尺度,這解釋了無噪聲功能關系的大部分變化。 第二種模式有較高的可能性; 然而,根據超參數的初始值,基于梯度的優化也可能會收斂到高噪聲解。 因此,對于不同的初始化,重復優化多次是很重要的。
[](../auto_examples/gaussian_process/plot_gpr_noisy.html)
### 1.7.2.2. GPR 和內核嶺回歸(Kernel Ridge Regression)的比較
內核脊回歸(KRR)和 GPR 通過內部使用 “kernel trick(內核技巧)” 來學習目標函數。 KRR學習由相應內核引起的空間中的線性函數,該空間對應于原始空間中的非線性函數。 基于平均誤差損失與脊正弦化,選擇內核空間中的線性函數。 GPR使用內核來定義先驗分布在目標函數上的協方差,并使用觀察到的訓練數據來定義似然函數。 基于貝葉斯定理,定義了目標函數上的(高斯)后驗分布,其平均值用于預測。
一個主要區別是,GPR 可以基于邊際似然函數上的梯度上升選擇內核的超參數, 而KRR需要在交叉驗證的損失函數(均方誤差損失)上執行網格搜索。 另一個區別是,GPR 學習目標函數的生成概率模型,因此可以提供有意義的置信區間和后驗樣本以及預測值, 而KRR僅提供預測。
下圖說明了人造數據集上的兩種方法,其中包括正弦目標函數和強噪聲。 該圖比較了基于 ExpSineSquared 內核的 KRR 和 GPR 的學習模型,適用于學習周期函數。 內核的超參數控制內核的平滑度(length\_scale)和周期性(周期性)。 此外,數據的噪聲水平由 GPR 通過內核中的另外的 WhiteKernel 組件和 KRR 的正則化參數 α 明確地學習。
[](../auto_examples/gaussian_process/plot_compare_gpr_krr.html)
該圖顯示,兩種方法都可以學習合理的目標函數模型。 GPR將函數的周期正確地識別為  (6.28),而 KRR 選擇倍增的周期為  。 此外,GPR 為 KRR 不可用的預測提供了合理的置信區間。 兩種方法之間的主要區別是擬合和預測所需的時間: 原則上KRR的擬合速度較快,超參數優化的網格搜索與超參數( “curse of dimensionality(維度詛咒)” )呈指數級關系。 GPR中的參數的基于梯度的優化不受此指數縮放的影響,因此在具有三維超參數空間的該示例上相當快。 預測的時間是相似的; 然而,生成 GPR 預測分布的方差需要的時間比生成平均值要長。
### 1.7.2.3. Mauna Loa CO2 數據中的 GRR
該示例基于 \[RW2006\] 的第 5.4.3 節。 它演示了使用梯度上升的對數邊緣似然性的復雜內核工程和超參數優化的示例。 數據包括在 1958 年至 1997 年間夏威夷 Mauna Loa 天文臺收集的每月平均大氣二氧 化碳濃度(以百萬分之幾(ppmv)計)。目的是將二氧化碳濃度建模為時間t的函數。
內核由幾個術語組成,負責說明信號的不同屬性:
- 一個長期的,順利的上升趨勢是由一個 RBF 內核來解釋的。 具有較大長度尺寸的RBF內核將使該分量平滑; 沒有強制這種趨勢正在上升,這給 GP 帶來了這個選擇。 具體的長度尺度和振幅是自由的超參數。
- 季節性因素,由定期的 ExpSineSquared 內核解釋,固定周期為1年。 該周期分量的長度尺度控制其平滑度是一個自由參數。 為了使準確周期性的衰減,采用帶有RBF內核的產品。 該RBF組件的長度尺寸控制衰減時間,并且是另一個自由參數。
- 較小的中期不規則性將由 RationalQuadratic 內核組件來解釋, RationalQuadratic 內核組件的長度尺度和 alpha 參數決定長度尺度的擴散性。 根據 \[RW2006\] ,這些不規則性可以更好地由 RationalQuadratic 來解釋, 而不是 RBF 內核組件,這可能是因為它可以容納幾個長度尺度。
- “noise(噪聲)” 一詞,由一個 RBF 內核貢獻組成,它將解釋相關的噪聲分量,
> 如局部天氣現象以及 WhiteKernel 對白噪聲的貢獻。 相對幅度和RBF的長度尺度是進一步的自由參數。
在減去目標平均值后最大化對數邊際似然率產生下列內核,其中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年左右才能做出置信度比較高的預測
[](../auto_examples/gaussian_process/plot_gpr_co2.html)
## 1.7.3. 高斯過程分類(GPC)
所述 [`GaussianProcessClassifier`](generated/sklearn.gaussian_process.GaussianProcessClassifier.html#sklearn.gaussian_process.GaussianProcessClassifier "sklearn.gaussian_process.GaussianProcessClassifier") 器實現了用于分類目的的高斯過程(GP),當測試的預測采用類概率的形式,更能夠用于概率分類。 GaussianProcessClassifier 在隱函數  之前設置GP先驗,然后通過鏈接函數進行壓縮以獲得概率分類。 隱函數  因此就是所謂的干擾函數(nuisance function),其值不能被觀測到,并且自身不具有相關性。 其目的是允許模型的表達形式更加簡便,并且  在預測過程中被去除(整合)。 GaussianProcessClassifier 實現了邏輯鏈接函數, 對于該邏輯,積分不能在分析上計算,但在二進制情況下很容易近似。
與回歸設置相反,即使設置了高斯過程先驗,隱函數  的后驗也不符合高斯分布, 因為高斯似然不適用于離散類標簽。相反,使用的是與邏輯鏈接函數(logit)對應的非高斯似然。 GaussianProcessClassifier 通過拉普拉斯近似(Laplace approximation)來估計非高斯后驗分布。 更多詳細信息,請參見 \[RW2006\] 的第 3 章。
GP先驗平均值假定為零。先驗的協方差是通過傳遞 [內核(kernel)](#gp-kernels) 對象來指定的。 在通過最大化基于傳遞的對數邊緣似然(LML)的 GaussianProcessRegressor 擬合期間, 優化內核的超參數 `optimizer` 。由于LML可能具有多個局部最優值, 所以優化器可以通過指定重復啟動 `n_restarts_optimizer` 。 第一次運行始終從內核的初始超參數值開始執行; 從已經從允許值的范圍中隨機選擇超參數值來進行后續運行。 如果初始超參數需要保持固定,None 可以傳遞作為優化器。
[`GaussianProcessClassifier`](generated/sklearn.gaussian_process.GaussianProcessClassifier.html#sklearn.gaussian_process.GaussianProcessClassifier "sklearn.gaussian_process.GaussianProcessClassifier") 通過執行基于OvR(one-versus-rest)或 OvO(one-versus-one )策略的訓練和預測來支持多類分類。 在OvR(one-versus-rest)策略中,每個類都配有一個二進制高斯過程分類器,該類別被訓練為將該類與其余類分開。 在 “one\_vs\_one” 中,對于每對類擬合一個二進制高斯過程分類器,這被訓練為分離這兩個類。 這些二進制預測因子的預測被組合成多類預測。更多詳細信息,請參閱 [多類別分類](multiclass.html#multiclass) 。
在高斯過程分類的情況下,”one\_vs\_one” 策略可能在計算上更廉價, 因為它必須解決涉及整個訓練集的每一個子集的許多問題, 而不是整個數據集的較少的問題。由于高斯過程分類與數據集的大小相互立方,這可能要快得多。 但是,請注意,”one\_vs\_one” 不支持預測概率估計,而只是簡單的預測。 此外,請注意, [`GaussianProcessClassifier`](generated/sklearn.gaussian_process.GaussianProcessClassifier.html#sklearn.gaussian_process.GaussianProcessClassifier "sklearn.gaussian_process.GaussianProcessClassifier") 在內部還沒有實現真正的多類 Laplace 近似, 但如上所述,在解決內部二進制分類任務的基礎上,它們使用OvR或OvO的組合方法。
## 1.7.4. GPC 示例
### 1.7.4.1. GPC 概率預測
該示例說明了對于具有不同選項的超參數的RBF內核的GPC預測概率。 第一幅圖顯示GPC具有任意選擇的超參數的預測概率,以及對應于最大LML(對數邊緣似然)對應的超參數。
雖然通過優化LML選擇的超參數具有相當大的LML,但是根據測試數據的對數損失,它們的表現更差。 該圖顯示,這是因為它們在階級邊界(這是好的)表現出類概率的急劇變化, 但預測概率接近0.5遠離類邊界(這是壞的)這種不良影響是由于GPC內部使用了拉普拉斯逼近。
第二幅圖顯示了內核超參數的不同選擇的LML(對數邊緣似然),突出了在第一幅圖中使用的通過黑點(訓練集)選擇的兩個超參數。
[](../auto_examples/gaussian_process/plot_gpc.html)
[](../auto_examples/gaussian_process/plot_gpc.html)
### 1.7.4.2. GPC 在 XOR 數據集上的舉例說明
此示例說明了在XOR數據上的GPC。各向同性的核( [`RBF`](generated/sklearn.gaussian_process.kernels.RBF.html#sklearn.gaussian_process.kernels.RBF "sklearn.gaussian_process.kernels.RBF") )和非固定的核( [`DotProduct`](generated/sklearn.gaussian_process.kernels.DotProduct.html#sklearn.gaussian_process.kernels.DotProduct "sklearn.gaussian_process.kernels.DotProduct") )對比固定性。 在這個特定的數據集上, DotProduct 內核獲得了更好的結果,因為類邊界是線性的,與坐標軸重合。 然而,實際上,諸如 [`RBF`](generated/sklearn.gaussian_process.kernels.RBF.html#sklearn.gaussian_process.kernels.RBF "sklearn.gaussian_process.kernels.RBF") 這樣的固定內核經常獲得更好結果。
[](../auto_examples/gaussian_process/plot_gpc_xor.html)
### 1.7.4.3. iris 數據集上的高斯過程分類(GPC)
該示例說明了用于虹膜數據集的二維版本上各向同性和各向異性RBF核的GPC的預測概率。 這說明了GPC對多類分類的適用性。 各向異性RBF內核通過為兩個特征維度分配不同的長度尺度來獲得稍高的LML(對數邊緣似然)。
[](../auto_examples/gaussian_process/plot_gpc_iris.html)
## 1.7.5. 高斯過程內核
內核(也可以叫做GPs上下文中的”協方差函數”) 是決定高斯過程(GP)先驗和后驗形狀的關鍵組成部分。 它們通過定義兩個數據點的“相似性”,并結合相似的 數據點應該具有相似的目標值的假設,對所學習的函數進行編碼。 內核可以分為兩類:固定內核,只取決于兩個數據點的距離, 不依賴于它們的絕對值 ,因此它們對于輸入空間中的轉換是不變的;非固定的內核,取 決于數據點的具體值。固定內核可以進一步細分為各向同性和各向 異性內核,其中各向同性內核不會在輸入空間中旋轉。想要了解 更多細節,請參看 [\[RW2006\]](#rw2006) 的第四章。
### 1.7.5.1. 高斯過程內核 API
[`Kernel`](generated/sklearn.gaussian_process.kernels.Kernel.html#sklearn.gaussian_process.kernels.Kernel "sklearn.gaussian_process.kernels.Kernel") 主要是用來計算數據點之間的高斯過程協方差。 為此,內核中 `__call__` 方法會被調用。該方法可以用于計算 2d陣列X中所有數據點對的“自動協方差”,或二維陣列X的數據點 與二維陣列Y中的數據點的所有組合的“互協方差”。以下論斷對于 所有內核k(除了 [`WhiteKernel`](generated/sklearn.gaussian_process.kernels.WhiteKernel.html#sklearn.gaussian_process.kernels.WhiteKernel "sklearn.gaussian_process.kernels.WhiteKernel"))都是成立的:`k(X) == K(X, Y=X)`。 如果僅僅是自協方差的對角線元素被使用,那么內核的方法 `diag()` 將會被調用, 該方法比等價的調用 `__call__`: `np.diag(k(X, X)) == k.diag(X)`具有更高的計算效率。
內核通過超參數向量  進行參數化。這些超參數可以 控制例如內核的長度或周期性(見下文)。通過設置 `__call__`方法的參數 `eval_gradient=True` ,所有的內核支持計算解析 內核自協方差對于  的解析梯度。該梯度被用來在 高斯過程中(不論是回歸型還是分類型的)計算LML(對數邊緣似然)函數 的梯度,進而被用來通過梯度下降的方法極大化LML(對數邊緣似然)函數 從而確定  的值。對于每個超參數,當對內核的實例 進行賦值時,初始值和邊界值需要被指定。通過內核對象屬性 `theta` ,  的當前值可以被獲取或者設置。更重要的是, 超參的邊界值可以被內核屬性 `bounds` 獲取。需要注意的是, 以上兩種屬性值(theta和bounds)都會返回內部使用值的日志轉換值, 這是因為這兩種屬性值通常更適合基于梯度的優化。每個超參數的 規范 [`Hyperparameter`](generated/sklearn.gaussian_process.kernels.Hyperparameter.html#sklearn.gaussian_process.kernels.Hyperparameter "sklearn.gaussian_process.kernels.Hyperparameter") 以實例形式被存儲在相應內核中。 請注意使用了以”x”命名的超參的內核必然具有self.x和self.x\_bounds這兩種屬性。
所有內核的抽象基類為 [`Kernel`](generated/sklearn.gaussian_process.kernels.Kernel.html#sklearn.gaussian_process.kernels.Kernel "sklearn.gaussian_process.kernels.Kernel") 。Kernel 基類實現了 一個相似的接口 `Estimator` ,提供了方法 `get_params()` , `set_params()` 以及 `clone()` 。這也允許通過諸如 `Pipeline` 或者 `GridSearch` 之類的元估計來設置內核值。 需要注意的是,由于內核的嵌套結構(通過內核操作符,如下所見), 內核參數的名稱可能會變得相對復雜些。通常來說,對于二元內核操作, 參數的左運算元以 `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) # Note: log-transformed
[ 0. -0.69314718 0.69314718]
>>> print(kernel.bounds) # Note: log-transformed
[[ -inf 2.30258509]
[ -inf 2.30258509]
[ -inf 2.30258509]]
```
所有的高斯過程內核操作都可以通過 [`sklearn.metrics.pairwise`](classes.html#module-sklearn.metrics.pairwise "sklearn.metrics.pairwise") 來進行互操作,反之亦然。 [`Kernel`](generated/sklearn.gaussian_process.kernels.Kernel.html#sklearn.gaussian_process.kernels.Kernel "sklearn.gaussian_process.kernels.Kernel") 的子類實例可以通過 `metric` 參數傳給 [`sklearn.metrics.pairwise`](classes.html#module-sklearn.metrics.pairwise "sklearn.metrics.pairwise") 中的
> `pairwise_kernels` 。更重要的是,超參數的梯度不是分析的,而是數字,所有這些內核只支持
各向同性距離。該參數 `gamma` 被認為是一個超參數,可以進行優化。其他內核參數在初始化時直接設置, 并保持固定。
### 1.7.5.2. 基礎內核
[`ConstantKernel`](generated/sklearn.gaussian_process.kernels.ConstantKernel.html#sklearn.gaussian_process.kernels.ConstantKernel "sklearn.gaussian_process.kernels.ConstantKernel") 內核類可以被用作 [`Product`](generated/sklearn.gaussian_process.kernels.Product.html#sklearn.gaussian_process.kernels.Product "sklearn.gaussian_process.kernels.Product") 內核類的一部分, 在它可以對其他因子(內核)進行度量的場景下或者作為更改高斯過程均值的
> [`Sum`](generated/sklearn.gaussian_process.kernels.Sum.html#sklearn.gaussian_process.kernels.Sum "sklearn.gaussian_process.kernels.Sum") 類的一部分。這取決于參數  的設置。該方法定義為:

[`WhiteKernel`](generated/sklearn.gaussian_process.kernels.WhiteKernel.html#sklearn.gaussian_process.kernels.WhiteKernel "sklearn.gaussian_process.kernels.WhiteKernel") 內核類的主要應用實例在于當解釋信號的噪聲部分時 可以作為內核集合的一部分。通過調節參數 , 該類可以用來估計噪聲級別。具體如下所示:

### 1.7.5.3. 內核操作
內核操作是把1~2個基內核與新內核進行合并。內核類 [`Sum`](generated/sklearn.gaussian_process.kernels.Sum.html#sklearn.gaussian_process.kernels.Sum "sklearn.gaussian_process.kernels.Sum") 通過  相加來合并 和  內核。內核類 [`Product`](generated/sklearn.gaussian_process.kernels.Product.html#sklearn.gaussian_process.kernels.Product "sklearn.gaussian_process.kernels.Product") 通過  把 和  內核進行合并。內核類 [`Exponentiation`](generated/sklearn.gaussian_process.kernels.Exponentiation.html#sklearn.gaussian_process.kernels.Exponentiation "sklearn.gaussian_process.kernels.Exponentiation") 通過  把基內核與 常量參數  進行合并。
### 1.7.5.4. 徑向基函數內核
[`RBF`](generated/sklearn.gaussian_process.kernels.RBF.html#sklearn.gaussian_process.kernels.RBF "sklearn.gaussian_process.kernels.RBF") 內核是一個固定內核,它也被稱為“平方指數”內核。它通過定長的參數 來對內核進行參數化。該參數既可以是標量(內核的各向同性變體)或者與輸入  (內核的各向異性變體) 具有相同數量的維度的向量。該內核可以被定義為:

這個內核是無限可微的,這意味著這個內核作為協方差函數的 GP 具有所有階數的均方差導數, 因此非常平滑。由RBF內核產生的GP的先驗和后驗示意圖如下所示:
[](../auto_examples/gaussian_process/plot_gpr_prior_posterior.html)
### 1.7.5.5. Matérn 內核
[`Matern`](generated/sklearn.gaussian_process.kernels.Matern.html#sklearn.gaussian_process.kernels.Matern "sklearn.gaussian_process.kernels.Matern") 內核是一個固定內核,是 [`RBF`](generated/sklearn.gaussian_process.kernels.RBF.html#sklearn.gaussian_process.kernels.RBF "sklearn.gaussian_process.kernels.RBF") 內核的泛化。它有一個額外的參數 , 該參數控制結果函數的平滑程度。它由定長參數  來實現參數化。該參數既可以是標量 (內核的各向同性變體)或者與輸入  (內核的各向異性變體)具有相同數量的維度的向量。 該內核可以被定義為:

因為  ,Matérn 內核收斂到 RBF 內核。 當  時,Matérn 內核變得與絕對指數內核相同時,即

特別的,當  時:

和  :

是學習函數的常用選擇,并且不是無限可微的(由 RBF 內核假定) 但是至少具有一階(  )或者二階(  )可微性。
通過  靈活控制學習函數的平滑性可以更加適應真正的底層函數關聯屬性。 通過 Matérn 內核產生的高斯過程的先驗和后驗如下圖所示:
[](../auto_examples/gaussian_process/plot_gpr_prior_posterior.html)
想要更進一步地了解不同類型的Matérn內核請參閱 [\[RW2006\]](#rw2006) , pp84。
### 1.7.5.6. 有理二次內核
[`RationalQuadratic`](generated/sklearn.gaussian_process.kernels.RationalQuadratic.html#sklearn.gaussian_process.kernels.RationalQuadratic "sklearn.gaussian_process.kernels.RationalQuadratic") 內核可以被看做不同特征尺度下的 [`RBF`](generated/sklearn.gaussian_process.kernels.RBF.html#sklearn.gaussian_process.kernels.RBF "sklearn.gaussian_process.kernels.RBF") 內核的規模混合(一個無窮和) 它通過長度尺度參數  和比例混合參數  進行參數化。 此時僅支持  標量的各向同性變量。內核公式如下:

從 RBF 內核中產生的高斯過程的先驗和后驗如下圖所示:
[](../auto_examples/gaussian_process/plot_gpr_prior_posterior.html)
### 1.7.5.7. 正弦平方內核
[`ExpSineSquared`](generated/sklearn.gaussian_process.kernels.ExpSineSquared.html#sklearn.gaussian_process.kernels.ExpSineSquared "sklearn.gaussian_process.kernels.ExpSineSquared") 內核可以對周期性函數進行建模。它由定長參數 以及周期參數  來實現參數化。此時僅支持  標量的各向同性變量。內核公式如下:

從ExpSineSquared內核中產生的高斯過程的先驗和后驗如下圖所示:
[](../auto_examples/gaussian_process/plot_gpr_prior_posterior.html)
### 1.7.5.8. 點乘內核
[`DotProduct`](generated/sklearn.gaussian_process.kernels.DotProduct.html#sklearn.gaussian_process.kernels.DotProduct "sklearn.gaussian_process.kernels.DotProduct") 內核是非固定內核,它可以通過在線性回歸的  的相關系數上加上 服從于  的先驗以及在線性回歸的偏置上加上服從于  的先驗來獲得。 該 [`DotProduct`](generated/sklearn.gaussian_process.kernels.DotProduct.html#sklearn.gaussian_process.kernels.DotProduct "sklearn.gaussian_process.kernels.DotProduct") 內核對于原點坐標的旋轉是不變的,因此不是轉換。它通過設置參數  來進行參數化。 當  時,該內核叫做同質線性內核;否則該內核是非同質的。內核公式如下:

[`DotProduct`](generated/sklearn.gaussian_process.kernels.DotProduct.html#sklearn.gaussian_process.kernels.DotProduct "sklearn.gaussian_process.kernels.DotProduct") 內核通常和指數分布相結合。實例如下圖所示:
[](../auto_examples/gaussian_process/plot_gpr_prior_posterior.html)
### 1.7.5.9. 參考文獻
\[RW2006\]*([1](#id3), [2](#id10), [3](#id14))* Carl Eduard Rasmussen and Christopher K.I. Williams, “Gaussian Processes for Machine Learning”, MIT Press 2006, Link to an official complete PDF version of the book [here](http://www.gaussianprocess.org/gpml/chapters/RW.pdf) .
## 1.7.6. 傳統高斯過程
在本節中,描述了版本 0.16.1 及之前 scikit 中高斯過程的實現, 請注意,此實現已被棄用,將在版本 0.18 中刪除。
### 1.7.6.1. 回歸實例介紹
假定我們要替代這個函數: 。 為了做到這一點,該功能被評估到一個實驗設計上。然后, 我們定義一個回歸和相關模型可能被其他參數指定的高斯模型, 并且要求模型能夠擬合數據。擬合過程由于受到實例化過程中 參數數目的影響可能依賴于參數的最大似然估計或者直接使用給定的參數。
```
>>> 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)
```
### 1.7.6.2. 噪聲數據擬合
當含噪聲的數據被用來做擬合時,對于每個數據點,高斯過程模型可以指定噪聲的方差。 [`GaussianProcess`](generated/sklearn.gaussian_process.GaussianProcess.html#sklearn.gaussian_process.GaussianProcess "sklearn.gaussian_process.GaussianProcess") 包含一個被添加到訓練數據得到的自相關矩陣對角線中的 參數 `nugget` 。通常來說這是一種類型的吉洪諾夫正則化方法。 在平方指數相關函數的特殊情況下,該歸一化等效于指定輸入中的小數方差。也就是:
![\mathrm{nugget}_i = \left[\frac{\sigma_i}{y_i}\right]^2](https://box.kancloud.cn/bec55a3bc74f44aece1e2a6c7b18cdde_125x49.jpg)
使用 `nugget` 以及 `corr` 正確設置,高斯過程可以更好地用于從噪聲數據恢復給定的向量函數。
### 1.7.6.3. 數學形式
#### 1.7.6.3.1. 初始假設
假設需要對電腦實驗的結果進行建模,例如使用一個數學函數:

同時假設這個函數是 *一個* 有關于 *一個* 高斯過程  的條件采用方法, 那么從這個假設出發,GPML 通常可以表示為如下形式:

其中,  是一個線性回歸模型,并且  是一個 以零為均值,協方差函數完全平穩的高斯過程:

 表示其方差,  表示僅僅基于樣本之間的絕對相關距離的相關函數,可能是特征(這是平穩性假設)
從這些基本的公式中可以注意到GPML僅僅是基本的線性二乘回歸問題的擴展。

除此之外,我們另外假定由相關函數指定的樣本之間的一些空間相干性(相關性)。 事實上,普通最小二乘法假設當  時,相關性模型 是 1;否則為 0 ,相關性模型為 *狄拉克* 相關模型–有時在克里金文獻中被稱為 *熔核* 相關模型
#### 1.7.6.3.2. 最佳線性無偏預測(BLUP)
我們現在推導出基于觀測結果的 *最佳線性無偏預測* 

它可以由 *給定的屬性* 加以派生:
- 它是線性的(觀測結果的線性組合)

- 它是無偏的
![\mathbb{E}[G(X) - \hat{G}(X)] = 0](https://box.kancloud.cn/2082024c10e5b502a96bc48bd762fb15_166x22.jpg)
- 它是最好的(在均方誤差的意義上)
![\hat{G}(X)^* = \arg \min\limits_{\hat{G}(X)} \; \mathbb{E}[(G(X) - \hat{G}(X))^2]](https://box.kancloud.cn/489ab77a5ec0deb037a3b3ac92d1bbc2_296x35.jpg)
因此最優的帶權向量  是以下等式約束優化問題的解
![a(X)^* = \arg \min\limits_{a(X)} & \; \mathbb{E}[(G(X) - a(X)^T y)^2] \\ {\rm s. t.} & \; \mathbb{E}[G(X) - a(X)^T y] = 0](https://box.kancloud.cn/f2fa088ff1f400f9ce1bbeddf5f8a650_315x60.jpg)
以拉格朗日形式重寫這個受約束的優化問題,并進一步尋求要滿足的一階最優條件, 從而得到一個以閉合形式表達式為終止形式的預測器 - 參見參考文獻中完整的證明。
最后,BLUP 為高斯隨機變量,其中均值為:

方差為:

其中:
- 根據自相關函數以及內置參數  所定義的相關性矩陣為:

- 在進行預測的點與 DOE 中的點之間的互相關的向量:

- 回歸矩陣 (例如范德蒙矩陣 如果  以多項式為基):

- 廣義最小二乘回歸權重:

- 和向量:

需要重點注意的是,高斯過程預測器的概率輸出是完全可分析的并且依賴于基本的線性代數操作。 更準確地說,預測結果的均值是兩個簡單線性組合(點積)的和,方差需要兩個矩陣反轉操作,但關聯 矩陣只能使用 Cholesky 分解算法分解一次。
#### 1.7.6.3.3. 經驗最佳線性無偏估計(EBLUP)
到現在為止,自相關和回歸模型都已假定給出。然而,在實踐中,它們從來都是未知的 因此需要為這些模型 [關聯模型](#correlation-models) 做出(積極的)經驗選擇。
根據這些選擇,可以來估計 BLUP 中涉及到的遺留未知參數。為此,需要使用一系列 被提供的觀測值同時結合一系列推斷技術。目前使用的方法是基于 DACE’s Matlab 工 具包的\*最大似然估計\* - 參見 DACE 手冊中的完全推導公式。最大似然估計的問題在 自相關參數中是一個全局優化的問題。這種全局優化通過 scipy.optimize 中的 fmin\_cobyla 優化函數加以實現。然而,在各向異性的情況下,我們提供了 Welch 的分量優化算法的實現 - 參見參考。
### 1.7.6.4. 關聯模型
由于幾乎相等的假設,常用的關聯模型和一些有名的SVM內核相匹配。它們必須要滿足 Mercer 條件 并且需要保持固定形式。然而,請注意,相關模型的選擇應該與觀察到來的原始實驗的已知特性一致。 例如:
- 如果原始實驗被認為是無限可微(平滑),則應使用 *平方指數關聯模型* 。
- 如果不是無限可微的, 那么需要使用 *指數關聯模型*.
- 還要注意,存在一個將衍生度作為輸入的相關模型:這是 Matern 相關模型,但這里并沒有實現( TODO ).
關于選擇合適的關聯模型更詳細的討論,請參閱 Rasmussen&Williams 的文獻。
### 1.7.6.5. 回歸模型
常用的線性回歸模型包括零階(常數)、一階和二階多項式。 但是可以以 Python 函數的形式指定它自己的特性,它將特征X 作為輸入,并返回一個包含函數集值的向量。唯一加以限制地是, 函數的個數不能超過有效觀測值的數目,因此基本的回歸問題不被\*確定\*。
### 1.7.6.6. 實現細節
模型通過 DACE 的 Matlab 工具包來實現。
參考文獻:
- [DACE, A Matlab Kriging Toolbox](http://imedea.uib-csic.es/master/cambioglobal/Modulo_V_cod101615/Lab/lab_maps/krigging/DACE-krigingsoft/dace/dace.pdf) S Lophaven, HB Nielsen, J Sondergaard 2002,
- W.J. Welch, R.J. Buck, J. Sacks, H.P. Wynn, T.J. Mitchell, and M.D. Morris (1992). Screening, predicting, and computer experiments. Technometrics, 34(1) 15–25.
- scikit-learn 0.19 中文文檔
- 用戶指南
- 1. 監督學習
- 1.1. 廣義線性模型
- 1.2. 線性和二次判別分析
- 1.3. 內核嶺回歸
- 1.4. 支持向量機
- 1.5. 隨機梯度下降
- 1.6. 最近鄰
- 1.7. 高斯過程
- 1.8. 交叉分解
- 1.9. 樸素貝葉斯
- 1.10. 決策樹
- 1.11. 集成方法
- 1.12. 多類和多標簽算法
- 1.13. 特征選擇
- 1.14. 半監督學習
- 1.15. 等式回歸
- 1.16. 概率校準
- 1.17. 神經網絡模型(有監督)
- 2. 無監督學習
- 2.1. 高斯混合模型
- 2.2. 流形學習
- 2.3. 聚類
- 2.4. 雙聚類
- 2.5. 分解成分中的信號(矩陣分解問題)
- 2.6. 協方差估計
- 2.7. 經驗協方差
- 2.8. 收斂協方差
- 2.9. 稀疏逆協方差
- 2.10. Robust 協方差估計
- 2.11. 新奇和異常值檢測
- 2.12. 密度估計
- 2.13. 神經網絡模型(無監督)
- 3. 模型選擇和評估
- 3.1. 交叉驗證:評估估算器的表現
- 3.2. 調整估計器的超參數
- 3.3. 模型評估: 量化預測的質量
- 3.4. 模型持久化
- 3.5. 驗證曲線: 繪制分數以評估模型
- 4. 數據集轉換
- 4.1. Pipeline(管道)和 FeatureUnion(特征聯合): 合并的評估器
- 4.2. 特征提取
- 4.3. 預處理數據
- 4.4. 無監督降維
- 4.5. 隨機投影
- 4.6. 內核近似
- 4.7. 成對的矩陣, 類別和核函數
- 4.8. 預測目標 (y) 的轉換
- 5. 數據集加載工具
- 6. 大規模計算的策略: 更大量的數據
- 7. 計算性能
- 教程
- 使用 scikit-learn 介紹機器學習
- 關于科學數據處理的統計學習教程
- 機器學習: scikit-learn 中的設置以及預估對象
- 監督學習:從高維觀察預測輸出變量
- 模型選擇:選擇估計量及其參數
- 無監督學習: 尋求數據表示
- 把它們放在一起
- 尋求幫助
- 處理文本數據
- 選擇正確的評估器(estimator)
- 外部資源,視頻和談話