淺析高斯過程迴歸(Gaussian process regression)
-
前言
高斯過程迴歸的和其他迴歸演算法的區別是:一般迴歸演算法給定輸入X,希望得到的是對應的Y值,擬合函式可以有多種多樣,線性擬合、多項式擬合等等,而高斯迴歸是要得到函式f(x)的分佈,那麼是如何實現的呢?
對於資料集 ,令 ,從而得到向量, 將所需要預測的的集合定義為,對應的預測值為, 根據貝葉斯公式有:
高斯迴歸首先要計算資料集中樣本之間的聯合概率分佈, ,為的均值所組成的向量,K為其協方差矩陣,再根據需要預測的的先驗概率分佈
其中共有兩個核心問題:(1)如何計算和方差矩陣(2)如何具體如何計算的概率分佈。
{}的協方差矩陣,一定要注意是自變數x的協方差矩陣,因為我們在進行對對應的的預測時,是依據和{}之間的協方差,來判斷其y值之間的差異性,從而基於概率公式得出預測值。
-
協方差矩陣的計算
定義函式 ,,則由概率論基本公式可得:
利用這樣的原始公式來計算協方差矩陣K是十分不方便的,我們先來理解一下高斯過程是如何利用Gaussian distribution 來描述樣本的,先來看圖1和圖2:
圖1中很明顯可以看出來y值的大小與自變數x值的取值相關性很小,對於這樣的資料,我們可以給出f(x)的先驗分佈:
其協方差矩陣為對角陣,任意不同x值之間的協方差均設為0
對於圖2,f(x)受x值影響較大,x值相近,y值也相近,呈現出較高的相關性,我們可以給出其先驗分佈,,通過以上兩個例子我們發現,的協方差矩陣與相關度很高,如果我們能夠使得 得到一個
我們需要知道以下兩個定理:
(1)協方差矩陣必須是半正定陣
(2)kernel fountion都是半正定陣。這就意味著我們在學習SVM的時候所學過的核函式形式都可以用
當然應用最廣的是RBF kernel,即如下式:
其中為超引數,是需要通過學習進行確定的引數,那麼我們只需要通過監督學習的方式學習到合適的kernel,即可很方便的計算出的協方差矩陣。
如何學習kernel的引數?很簡單kernel 優劣的評價標準就是在要的條件下,讓最大,為了方便求導我們將目標函式設為,接下來利用梯度下降法來求最優值即可:
-
後驗概率分佈的計算
如圖所示,紅色的點代表已知的資料點,即訓練集 ,給出 的先驗分佈:
,其中K為協方差矩陣,我們以RBF kernel來計算:
綠色的叉代表需要估計的點的X值,我們給定其先驗分佈
已知 , ,可計算其其聯合概率分佈的先驗:
其中為 的協方差矩陣,,
有了的先驗分佈,以及上面計算的,根據貝葉斯公式可以計算 的後驗概率:
從而得出對於的估計,
圖3擬合的結果如圖5所示,圖5展示的擬合曲線是僅顯示均值的曲線。圖6、圖7展現了高斯過程迴歸對於模型誤差的估計能力,在圖6中在後半部分資料波動較大時,其估計的方差表徵了在這一部分的波動情況;在圖7中也較好的展示了,在位置資料點,高斯過程迴歸對於該點函式值均值和方差的估計。
-
求解高斯過程的工具sklearn.gaussian_process
在sklearn中提供了十分方便的gaussian_process庫,可以用來進行高斯過程求解,我們可以呼叫GaussianProcessRegressor來進行高斯過程迴歸的求解,函式具體介紹如下:
引數: |
kernel:核心物件
alpha:float或array-like,可選(預設值:1e-10)
優化器:字串或可呼叫,可選(預設值:“fmin_l_bfgs_b”)
n_restarts_optimizer:int,optional(預設值:0)
normalize_y:boolean,optional(預設值:False)
copy_X_train:bool,optional(預設值:True)
random_state:int,RandomState例項或None,可選(預設值:None)
|
---|---|
屬性: |
X_train_:類似陣列,shape =(n_samples,n_features)
y_train_:array-like,shape =(n_samples,[n_output_dims])
kernel_:核心物件
L_:類似陣列,shape =(n_samples,n_samples)
alpha_:array-like,shape =(n_samples,)
log_marginal_likelihood_value_:float
|
fit (X,y) |
擬合高斯過程迴歸模型。 |
獲取此估算工具的引數。 | |
返回訓練資料的theta的log-marginal似然。 | |
predict (X [,return_std,return_cov]) |
使用高斯過程迴歸模型進行預測 |
sample_y (X [,n_samples,random_state]) |
從高斯過程中抽取樣本並在X處進行評估。 |
score (X,y [,sample_weight]) |
返回預測的確定係數R ^ 2。 |
設定此估算器的引數。 |
提供了一個簡單的小程式,大家可以用來做一些小實驗:
import numpy as np
import matplotlib.pyplot as plt
import random
from sklearn.gaussian_process import GaussianProcessRegressor
a=np.random.random(50).reshape(50,1)
b=a*2+np.random.random(50).reshape(50,1)
plt.scatter(a,b,marker = 'o', color = 'r', label='3', s = 15)
plt.show()
gaussian=GaussianProcessRegressor()
fiting=gaussian.fit(a,b)
c=np.linspace(0.1,1,100)
d=gaussian.predict(c.reshape(100,1))
plt.scatter(a,b,marker = 'o', color = 'r', label='3', s = 15)
plt.plot(c,d)
plt.show()