机器学习笔记:高斯过程
1 高斯分布回顧
一維高斯分布?
????????當維度上升到多維的時候(比如有限的p維),我們稱之為高維高斯分布,記作:
????????其中 μ是p維向量,表示每個維度的均值,Σ的第(i,j)項表示第i個維度和第j個維度之間的協方差
2 高斯過程
高斯過程可以看成是定義在連續域上的無限維高斯分布
用符號表示,有:
?2.1 高斯過程舉例
以下圖為例,假設橫軸表示時間,縱軸表示體能值。
假設對于某一個物種而言,在任何時刻,體能值都滿足正態分布(只不過不同的時間點,分布的均值和方差可能不同)
?
????????我們在圖中選取了5個點,對應5個時刻的體能值,分別滿足高斯分布
? ? ? ? 不失一般性,我們有:任取一個時刻t,
? ? ? ? 而圖中的兩條虛線是兩個高斯過程的樣本。也即我們取遍所有時刻的t,獲得的連成的一條虛線?
?2.2 形式化語言描述高斯過程
我們和p維的高斯分布進行類比:
| p維高斯分布 | 高斯過程(無限維高斯分布) | |
| 均值 | 關于時刻t的函數,m(t) | |
| 方差 | 核函數(協方差函數)k(s,t),其中s和t分別代表任意兩個時刻 | |
| 表示 |
?2.3 徑向基函數(RBF)
這是一種較為常見的核函數
?
- ?這里的σ和l是徑向基函數的超參數,是可以提前設置好的
- s和t表示高斯過程連續域上的兩個不同的時間點,兩個點距離越大,兩個分布之間的協方差值越小,相關性越小
2.3.1RBF代碼
import numpy as np def rbf(x):sigma=1l=1#設置兩個rbf的超參數m=x.shape[0]k=np.zeros((m,m)) #初始化這個數據的徑向基矩陣for i in range(m):for j in range(m):k[i][j]=np.exp(-np.sum((x[i]-x[j])**2)/2) #這里為什么要sum呢?因為我某一個時刻,特征可能不止一個維度(就像這里我們每個時刻是兩個維度)return(k)a=np.array([[1,2],[3,4],[5,6]])#三個時刻的數據,每個時刻有兩維特征rbf(a) ''' array([[1.00000000e+00, 1.83156389e-02, 1.12535175e-07],[1.83156389e-02, 1.00000000e+00, 1.83156389e-02],[1.12535175e-07, 1.83156389e-02, 1.00000000e+00]]) ''' #這相當于一個3*3的協方差矩陣3 高斯過程回歸
這個過程可以看成先驗概率+觀測值——>后驗概率的過程
先驗概率:通過μ(t)和k(s,t)定義一個高斯過程
3.1 高維高斯分布的條件概率
高斯分布的聯合概率,邊緣概率和條件概率都仍然滿足高斯分布
假設n維隨機變量滿足:
如果我們把這n維的隨機變量分成兩部分:p維的xa和q維的xb,(q+p=n),那么我們有:
?其中?,
同時,條件概率也是高維高斯分布
?3.2 類比到高斯過程回歸
????????我們將均值向量換成均值函數,把協方差矩陣換成核函數,把高維高斯分布看成高斯過程(無限維高斯分布)
假設我們有觀測值(X,Y),于是我們記其他的非觀測點是
首先,聯合分布是滿足無限維高斯分布的
?與此同時,條件概率也滿足無限維高斯分布(高斯過程)
類比前面的,我們現在有:
?
?
?3.3高斯過程實例
?下面我們來實際的進行代碼演示
令:
【注:這里的μ(X)是Y的分布的均值,不是X的分布均值 】
中的?
?取四個觀測值 X=[1,3,7,9] ,Y為
?我們在四個觀測點的基礎上,來求高斯過程的后驗。
?在下面的具體程序實現中,由于繪圖是離散化處理的,因此連續域上的均值函數以及核函數,我們使用一個?很大的 n?維均值向量以及n×n??協方差矩陣進行表示
?3.3.1 代碼部分
import numpy as np import matplotlib.pyplot as plt def rbf(x,y,l=0.5,simga=0.2):sigma=1l=1#設置兩個rbf的超參數m=x.shape[0]n=y.shape[0]k=np.zeros((m,n), dtype=float)#初始化這個數據的徑向基矩陣for i in range(m):for j in range(n):k[i][j]=np.exp(-np.sum((x[i]-y[j])**2)/(2*l**2))*simga**2#這里為什么要sum呢?因為我某一個時刻,特征可能不止一個維度(就像這里我們每個時刻是兩個維度)return(k)def getY(x):#生成觀測值對應的YY=np.sin(x)*0.4+np.random.normal(0,0.05,size=x.shape)return(Y)def guassian_process(X,X_star):K_XX=rbf(X,X)#f(X,X)K_XX_=rbf(X,X_star)#f(X,X*)K_X_X=rbf(X_star,X)#f(X*,X)K_X_X_=rbf(X_star,X_star)#f(X*,X*)K_XX_inv=np.linalg.inv(K_XX+ 1e-8 * np.eye(len(X)))#f(X,X)的逆,加后一項是為了防止不可逆mu_star=K_X_X.dot(K_XX_inv).dot(Y-0)+0#μ* 后面的μ(X*)也是0,是因為整體的μ(X)是0,去掉那幾個點之后的μ(X*)也是0cov_star=K_X_X_-K_X_X.dot(K_XX_inv).dot(K_XX_)#Σ*return(mu_star,cov_star)#根據觀察點X,修正生成高斯過程新的均值和協方差f,ax=plt.subplots(2, 1,figsize=(10,10), sharex=True,sharey=True) #繪制高斯過程的先驗 (μ(x)=0) X_pre = np.arange(0, 10, 0.1) Y_pre = np.array([0]*len(X_pre))conv_pre=rbf(X_pre,X_pre)uncertainty=1.96*np.sqrt(np.diag(conv_pre)) #1.96是高斯分布的95%置信區間,這里表示每個點對應的95%置信區間ax[0].fill_between(X_pre,Y_pre+uncertainty,Y_pre-uncertainty,alpha=0.2)ax[0].plot(X_pre,Y_pre,label="pre_expectation") ax[0].legend() #ax[0]繪制的是完全沒有任何觀測點的時候的先驗概率分布,我們只知道μ(X)=0X=np.array([1,3,7,9]) Y=getY(X) #我們觀測到了這四個點,其他的點μ(x)依舊為0 X_star=np.arange(0,10,0.1) Y_star,conv_star=guassian_process(X,X_star)#得到 f(x*)|Y的均值和方差 uncertainty_star=1.96*np.sqrt(np.diag(conv_star)) ax[1].fill_between(X_star,Y_star+uncertainty_star,Y_star-uncertainty_star,alpha=0.2) ax[1].plot(X_star,Y_star,label="after_expectation") ax[1].scatter(X,Y,c='green') ax[1].legend() #ax[1]繪制的是有四個觀測點之后的后驗概率分布?3.3.2 結論部分
?????????ax[0]繪制的是完全沒有任何觀測點的時候的先驗概率分布,我們只知道μ(X)=0;ax[1]繪制的是有四個觀測點之后的后驗概率分布。
????????明顯可以看出,由于觀測點信息的帶入,連續域上各個點的均值發生了變化。同時大部分取值點的??置信空間也收窄,證明確定性得到了增強。
?參考內容:如何通俗易懂地介紹 Gaussian Process? - 知乎 (zhihu.com)
4 sklearn?
sklearn 筆記:高斯過程_UQI-LIUWJ的博客-CSDN博客
總結
以上是生活随笔為你收集整理的机器学习笔记:高斯过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matplotlib 知识点整理:ax与
- 下一篇: numpy笔记:random.permu