概率論PRML

1.2 概率論

加法率:

P(X)=YP(X,Y)P(X)=∑YP(X,Y)

乘法率:

P(X,Y)=P(Y|X)P(X)=P(Y,X)=P(X|Y)P(Y)P(X,Y)=P(Y|X)P(X)=P(Y,X)=P(X|Y)P(Y)

由乘法率可得 Bayes 公式:

P(Y|X)=P(X|Y)P(Y)P(X)P(Y|X)=P(X|Y)P(Y)P(X)

再由加法率和乘法率,Bayes 公式的分母可以寫成:

P(X)=YP(X,Y)=YP(X|Y)P(Y)P(X)=∑YP(X,Y)=∑YP(X|Y)P(Y)

所以 Bayes 公式的分母可以看成是一個歸一化項,使得條件概率 P(Y|X)P(Y|X) 對所有的 YY 求和之後和爲 1

如果 P(X,Y)=P(X)P(Y)P(X,Y)=P(X)P(Y),那麼 X,YX,Y 是獨立的。

1.2.1 概率密度函數

概率密度函數

對於實值變量 xx,概率密度函數(probability density function) p(x)p(x) 定義爲:當δx>0,δx0δx>0,δx→0 時,變量 xx 落在區間 (x,x+δx)(x,x+δx) 範圍內的概率爲 p(x)δxp(x)δx

xx 落在任意區間 (a,b)(a,b) 的概率爲:

P(x(a,b))=bap(x)dxP(x∈(a,b))=∫abp(x)dx

對於概率密度函數,它需要滿足兩個條件:

p(x)p(x)dx0=1(1)(2)(1)p(x)≥0(2)∫−∞∞p(x)dx=1

對於隨機變量間這樣的一個變換 x=g(y)x=g(y),設 x,yx,y 的概率密度函數分別爲 px(x)px(x) 和 py(y)py(y),那麼 xx 落在 (x,x+δx)(x,x+δx) 可以對應於 yy 落在 (y,y+δy)(y,y+δy) 的情況,並有 px(x)δxpy(y)δypx(x)δx≃py(y)δy,從而:

py(y)=px(x)dydx=px(g(y))|g(y)|py(y)=px(x)|dydx|=px(g(y))|g′(y)|

累積分佈函數

累積分佈函數(cumulative distribution function)定義爲:

P(z)=zp(x)dxP(z)=∫−∞zp(x)dx

滿足:

P(x)=p(x)P′(x)=p(x)

聯合概率密度分佈

對於多個變量 x1,,xDx1,…,xD(用 xx 表示),定義聯合概率密度爲 p(x)=p(x1,,xD)p(x)=p(x1,…,xD),滿足當 xx 落在一個包含 xx 的足夠小的空間體積 δxδx 中時,其概率爲 p(x)δxp(x)δx

它也需要滿足:

p(x)p(x)dx0=1(3)(4)(3)p(x)≥0(4)∫p(x)dx=1

其中積分是對整個空間進行積分。

對於概率密度函數,我們的加法法則乘法法則仍然適用:

p(x)p(x,y)=p(x,y)dy=p(y|x)p(x)(5)(6)(5)p(x)=∫p(x,y)dy(6)p(x,y)=p(y|x)p(x)

概率質量函數

對於離散的 xx 我們有時候將概率密度函數叫做概率質量函數,因爲它的質量相當於集中在了某個允許的 xx 上。

1.2.2 期望和方差

期望

函數 f(x)f(x) 在概率密度函數 p(x)p(x) 下的均值叫做 f(x)f(x) 的期望(expectation)。

離散分佈下,定義爲:

E[f]=xp(x)f(x)E[f]=∑xp(x)f(x)

連續分佈下,定義爲:

E[f]=p(x)f(x)dxE[f]=∫p(x)f(x)dx

如果給定了 NN 個從 p(x)p(x) 中隨機抽樣的點,那麼期望可以近似爲

E[f]1Nn=1Nf(xn)E[f]≃1N∑n=1Nf(xn)

當 NN→∞ 是,等式成立。

多元函數可以對其中的一個參數求期望,例如 Ex[f(x,y)]Ex[f(x,y)] 是函數 f(x,y)f(x,y) 在概率密度 f(x)f(x) 上的期望,注意,它是一個關於 yy 的函數。

條件期望

我們可以考慮一個函數 f(x)f(x) 在條件分佈 p(x|y)p(x|y) 下的條件期望(conditional expectation),當 xx 是離散變量,定義爲:

Ex[f|y]=xp(x|y)f(x)Ex[f|y]=∑xp(x|y)f(x)

當 xx 是連續變量時,定義爲

Ex[f|y]=p(x|y)f(x)dxEx[f|y]=∫p(x|y)f(x)dx

方差

f(x)f(x) 的方差(variance)定義爲:

var[f]=E[(f(x)E[f(x)])2]var⁡[f]=E[(f(x)−E[f(x)])2]

它表示 f(x)f(x) 偏離其均值 E[f(x)]E[f(x)] 的程度。

對平方進行展開之後,方差可以寫成:

var[f]=E[f(x)2]E[f(x)]2var⁡[f]=E[f(x)2]−E[f(x)]2

特別地,我們考慮 xx 本身的方差:

var[x]=E[x2]E[x]2var⁡[x]=E[x2]−E[x]2

協方差

對於兩個隨機變量 x,yx,y,其協方差(covariance)定義爲:

cov[x,y]=Ex,y[(xE[x])(yE[y])]=Ex,y[xy]E[x]E[y](7)(8)(7)cov⁡[x,y]=Ex,y[(x−E[x])(y−E[y])](8)=Ex,y[xy]−E[x]E[y]

當變量 x,yx,y 獨立時,協方差爲 00

協方差矩陣

對於兩個隨機向量 x,yx,y,其協方差爲一個矩陣:

cov[x,y]=Ex,y[(xE[x])(yE[y])]=Ex,y[xy]E[x]E[y](9)(10)(9)cov⁡[x,y]=Ex,y[(x−E[x])(y⊤−E[y⊤])](10)=Ex,y[xy⊤]−E[x]E[y⊤]

如果只是考慮隨機向量 xx 自身分量之間的協方差,那麼我們有 cov[x]cov[x,x]cov⁡[x]≡cov⁡[x,x]

1.2.3 Bayes 概率

假設我們有一組模型的參數 ww,並且做出假定:這組參數服從一定的先驗概率分佈 p(w)p(w)

D={t1,,tn}D={t1,…,tn} 是我們觀測到的一組數據,這組數據在參數 ww 下的條件概率分佈爲 p(D|w)p(D|w)

Bayes 公式告訴我們:

p(w|D)=p(D|w)p(w)p(D)p(w|D)=p(D|w)p(w)p(D)

這給了我們一種衡量在觀測到數據 DD 的情況下,參數 ww 的不確定性的方法。

似然函數

p(D|w)p(D|w) 可以看成是給定觀測數據 DD 的情況下關於參數向量 ww 的一個函數,通常叫做似然函數(likelihood function)。

似然函數反映了在給定一組參數 ww 的情況下,生成這組觀測數據的一種可能性。注意它並不是一個關於 ww 的概率分佈。

給定似然函數的定義,我們可以將上面的 Bayes 公式表示爲:

posteriorlikelihood×priorposterior∝likelihood×prior

這三個量都是 ww 的函數。

對於分母,在給定觀測數據 DD 的情況下是一個歸一化常數,可以寫成:

p(D)=p(D|w)p(w)dwp(D)=∫p(D|w)p(w)dw

在 Bayes 學派和頻率學派的眼中,似然函數 p(D|w)p(D|w) 都扮演了一個重要角色。但二者對於似然函數的使用方式是截然不同的。

在頻率學派眼中,ww 被看成是一個固定的參數,其值由某些估計量來決定,誤差的計算要考慮數據 DD 的分佈;在 Bayes 學派眼中,數據集 DD 是唯一的,參數 ww的不確定性只來自於 ww 的一個概率分佈。

頻率估計量:最大似然估計

一個最常用的頻率估計量就是最大似然(maximum likelihood)估計:

wML=argmaxwp(D|w)wML=argmaxw⁡p(D|w)

這相當於選擇使得觀測數據 DD 出現的概率最大化的 ww

在機器學習的文獻中,似然函數的負對數通常被叫做一個損失函數(error function),因爲負對數函數是單調遞減的函數,因此最大似然就相當於最小化損失函數。

一種衡量頻率估計量誤差大小的方法是 bootstrap:假設我們有 NN 個數據 X={x1,,xN}X={x1,…,xN},我們從這寫數據中有放回的抽樣 NN 個數據得到一組新的數據 XBXB。 重複進行 LL 次這樣的操作,得到 LL 組這樣的抽樣數據,然後可以通過這 LL 組抽樣數據的統計結果估計最大似然估計的誤差。

Bayes 估計

Bayes 估計的一個重要觀點是先驗知識的引入,根據後驗概率來決定參數 ww

考慮拋硬幣的情況,假設我們拋三次,每次都得到正面,那麼最大似然估計會得到這枚硬幣會 100% 得到正面的結論,而 Bayes 估計不會得到這麼極端的結論。

兩者並沒有什麼好壞之分,只不過是看問題的角度不同。Bayes 估計如果選定的先驗不好,也可能得到很差的結果。

1.2.4 高斯分佈

高斯分佈(Gaussian distribution),又叫正態分佈(normal distribution)。

對於實值變量 xx,高斯分佈定義爲:

N(x μ,σ2)=1(2πσ2)1/2exp{12σ2(xμ)2}N(x| μ,σ2)=1(2πσ2)1/2exp⁡{−12σ2(x−μ)2}

參數爲均值 μμ 和方差 σ2σ2。方差的平方根 σσ 叫做標準差,方差的倒數 β=1σ2β=1σ2 叫做精度。

其圖像如下所示:

In [1]:
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt

%matplotlib inline

from scipy.stats import norm

xx = np.linspace(-3, 3, 200)

norm_xx = norm.pdf(xx)

fig, ax = plt.subplots()

ax.plot(xx, norm_xx, "r")
ax.set_ylim(0, 0.5)
ax.set_ylabel(r"$\mathcal{N}\left(x|\mu,\sigma^2\right)$", fontsize="xx-large")
ax.set_yticks([])
ax.set_yticklabels([])

ax.set_xticks([0])
ax.set_xticklabels([r"$\mu$"], fontsize="xx-large")

ax.text(-.1, 0.25, "$2\sigma$", fontsize="xx-large")

ax.annotate("",
            xy=(-1, 0.24), xycoords='data',
            xytext=(1, 0.24), textcoords='data',
            arrowprops=dict(arrowstyle="<->",
                            connectionstyle="arc3"), 
            )

plt.show()

下面證明這是一個概率分佈,首先,從定義中可以看出:

N(x μ,σ2)>0N(x| μ,σ2)>0

然後是積分:

N(x μ,σ2)dx=1∫−∞∞N(x| μ,σ2)dx=1

這個結果可以通過計算 I=exp(x2)dxI=∫∞∞exp⁡(x2)dx 得到(計算 I2I2,並換成極座標計算)。

xx 的期望爲(令 y=x+μy=x+μ,對 yy 的積分變成一個奇函數的積分加上 μμ 乘以一個高斯分佈的積分):

E[x]=N(x μ,σ2)x dx=μE[x]=∫−∞∞N(x| μ,σ2)x dx=μ

其方差爲(等式 exp{12σ2(xμ)2}dx=(2πσ2)1/2∫−∞∞exp⁡{−12σ2(x−μ)2}dx=(2πσ2)1/2 兩邊對 σ2σ2 求導):

var[x]=N(x μ,σ2)(xμ)2dx=σ2var[x]=∫−∞∞N(x| μ,σ2)(x−μ)2dx=σ2

因此:

E[x2]=E[x]2+var[x]=μ2+σ2E[x2]=E[x]2+var[x]=μ2+σ2

概率分佈的最大值叫做衆數(mode),高斯分佈的衆數就是均值 μμ

多維高斯分佈

對於 DD 維的向量 xx,高斯分佈定義爲:

N(x| μ,Σ)=1(2π)D/21|Σ|1/2exp{12(xμ)Σ1(xμ)}N(x| μ,Σ)=1(2π)D/21|Σ|1/2exp⁡{−12(x−μ)⊤Σ−1(x−μ)}

其中,DD 維向量 μμ 是均值,D×DD×D 矩陣 ΣΣ 是方差,|Σ||Σ| 是其行列式。

最大似然估計

假設我們現在有 NN 組對 xx 的觀測數據 x=(x1,,xN)Tx=(x1,…,xN)T,這些數據是獨立同分布(independent and identically distributed, i.i.d.)的,都服從一個均值 μμ,方差 σ2σ2 的高斯分佈。那麼在給定這些參數的情況下,出現這些觀測數據的概率,或者從參數的角度來說,似然函數爲:

p(x | μ,σ2)=n=1NN(xn μ,σ2)p(x | μ,σ2)=∏n=1NN(xn| μ,σ2)

通常最大似然的問題經常轉化爲求最大對數似然的問題:

lnp(x | μ,σ2)=12σ2n=1N(xnμ)2N2lnσ2N2ln(2π)ln⁡p(x | μ,σ2)=−12σ2∑n=1N(xn−μ)2−N2ln⁡σ2−N2ln⁡(2π)

對 μμ 最大化,我們得到最大似然解:

μML=1Nn=1NxnμML=1N∑n=1Nxn

即樣本均值。

對 σ2σ2 最大化,我們得到:

σ2ML=1Nn=1N(xnμML)2σML2=1N∑n=1N(xn−μML)2

即樣本方差。

但是這個解不是無偏的,我們可以計算它們的期望:

E[μML]E[σ2ML]=1Nn=1NE[xn]=μ=E[1Nn=1N(xn1Nm=1Nxm)]=1Ni=1NE[x2n2Nxnm=1xm+1N2m=1Nl=1Nxmxl]=(μ2+σ2)2(μ2+1Nσ2)+μ2+1Nσ2=(N1N)σ2(11)(12)(13)(14)(15)(11)E[μML]=1N∑n=1NE[xn]=μ(12)E[σML2]=E[1N∑n=1N(xn−1N∑m=1Nxm)](13)=1N∑i=1NE[xn2−2Nxn∑m=1xm+1N2∑m=1N∑l=1Nxmxl](14)=(μ2+σ2)−2(μ2+1Nσ2)+μ2+1Nσ2(15)=(N−1N)σ2

用到了:

  • 當 m=nm=n 時,E[xmxn]=E[x2n]=μ2+σ2E[xmxn]=E[xn2]=μ2+σ2
  • 當 mnm≠n 時,E[xmxn]=E[xn]E[xm]=μ2E[xmxn]=E[xn]E[xm]=μ2

因此,方差的一個無偏估計爲:

σ~2=NN1σ2ML=1N1n=1N(xnμML)2σ~2=NN−1σML2=1N−1∑n=1N(xn−μML)2

隨着 NN 的增大,方差估計的誤差也隨之增大。

1.2.5 重新理解曲線擬合

對於曲線擬合的問題,設訓練集輸入爲 x=(x1,,xN)x=(x1,…,xN)⊤,對應的目標值爲 t=(t1,,tN)t=(t1,…,tN)⊤

我們將我們的不確定性用高斯分佈來表示,假設給定 xx,對應的目標值 tt 服從一個均值爲 y(x,w)y(x,w) 的高斯分佈:

p(t| x,w,β)=N(t y(x,w),β1)p(t| x,w,β)=N(t| y(x,w),β−1)
In [2]:
xx = np.linspace(-0.9, 0.9, 100)
yy = 4 * xx - np.sin(xx * np.pi)

fig, ax = plt.subplots()
ax.plot(xx, yy, color="red")

ax.set_xlim(-1, 1)
ax.set_ylim(-4, 4)

ax.set_xticks([0])
ax.set_xticklabels([r'$x_0$'], fontsize="xx-large")
ax.set_yticks([0])
ax.set_yticklabels([r'$y(x_0, \mathbf{w})$'], fontsize="xx-large")

xx = np.linspace(-4, 4, 100)
yy = norm.pdf(xx, scale=0.5) / 5

ax.plot([-1, 0], [0, 0], "g--")
ax.plot([0, 0], [-4, 4], "k")
ax.plot(yy, xx)

ax.annotate("",
            xy=(0.75, -0.5), xycoords='data',
            xytext=(0.75, 0.5), textcoords='data',
            arrowprops=dict(arrowstyle="<->",
                            connectionstyle="arc3"), 
            )

ax.text(0.77, -0.2, r'$2\sigma$', fontsize="xx-large")
ax.text(0.15, -1, r'$p(t|x_0,\mathbf{w}, \beta)$', fontsize="xx-large")
ax.text(0.5, 3, r'$y(x, \mathbf{w})$', fontsize="xx-large")

plt.show()

最大似然

設訓練集數據是獨立同分布的,那麼似然函數爲:

p(t|x,w,β)=i=1NN(tn y(x,w),β1)p(t|x,w,β)=∑i=1NN(tn| y(x,w),β−1)

對數似然爲:

lnp(t|x,w,β)=β2n=1N{y(x,w)tn}2+N2lnβN2ln(2π)ln⁡p(t|x,w,β)=−β2∑n=1N{y(x,w)−tn}2+N2ln⁡β−N2ln⁡(2π)

設係數的最大似然解爲 wMLwML,從最大化對數似然的角度來看,求它的問題相當於最小化:

12n=1N{y(x,w)tn}212∑n=1N{y(x,w)−tn}2

這就是之前最小化平方誤差和的結果。

因此最小化平方誤差和可以看成是高斯噪音假設下的最大似然的結果。

再對精度 ββ 求最大似然,我們有(可以理解爲照搬之前求 σ2σ2 的結果):

1βML=1Ni=1N{y(x,w)tn}21βML=1N∑i=1N{y(x,w)−tn}2

我們有了最大似然的結果之後,對於一個新的輸入 xx,其輸出 tt 應當滿足:

p(t| x,wML,βML)=N(t y(x,wML),β1ML)p(t| x,wML,βML)=N(t| y(x,wML),βML−1)

最大化後驗分佈

假設我們對係數 ww 有一個先驗的知識(MM 是多項式階數,加上常數項一共 M+1M+1 維):

p(w | α)=N(w | 0,α1I)=(α2π)(M+1)/2exp{α2ww}p(w | α)=N(w | 0,α−1I)=(α2π)(M+1)/2exp⁡{−α2w⊤w}

αα 控制這個模型的先驗分佈,這一類的參數通常被叫做超參(hyperparameters),Bayes 公式告訴我們,後驗概率正比與先驗概率和似然函數的乘積:

p(w | x,t,α,β)p(t | x,w,β) p(w | α)p(w | x,t,α,β)∝p(t | x,w,β) p(w | α)

我們可以通過最大化後驗概率(maximum posterior, MAP)來決定參數 ww 的值,對上式求對數,並去掉跟 ww 無關的項,我們相當於要最大化:

β2n=1N{y(x,w)tn}2α2ww−β2∑n=1N{y(x,w)−tn}2−α2w⊤w

即最小化

β2n=1N{y(x,w)tn}2+α2wwβ2∑n=1N{y(x,w)−tn}2+α2w⊤w

因此,MAP 的結果相當於給多項式擬合加二範數正則化的結果,其中正則參數 λ=α/βλ=α/β

1.2.6 Bayes 曲線擬合

雖然在 MAP 中,我們引入了先驗分佈,但是本質上它還是一個點估計,本質上並不是一個完全的 Bayes 估計。

一個完全的 Bayes 估計要求我們對 ww 的所有值進行積分。

對於之前的曲線擬合問題,給定訓練集 xx 和 tt,對於一個新的測試樣例 xx,其目標值爲 tt,我們考慮預測的分佈 p(t | x,x,t)p(t | x,x,t)(這裏我們假定 β,αβ,α 兩個參數已經給定了)

Bayes 公式給出:

p(t | x,x,t)=p(t | x,w)p(w | x,t)dwp(t | x,x,t)=∫p(t | x,w)p(w | x,t)dw

其中 p(t | x,w)p(t | x,w) 是之前給定的高斯分佈,p(w | x,t)p(w | x,t) 是訓練集上的後驗概率(也是一個高斯分佈)。

由於高斯分佈的性質,上面的式子本質上也是一個高斯分佈,因此可以寫成

p(t | x,x,t)=N(t | m(x),s2(x))p(t | x,x,t)=N(t | m(x),s2(x))

其中均值和方差分別爲

m(x)s2(x)=βϕ(x)TSn=1Nϕ(xn)tn=β1+ϕ(x)Sϕ(x)(16)(17)(16)m(x)=βϕ(x)TS∑n=1Nϕ(xn)tn(17)s2(x)=β−1+ϕ(x)⊤Sϕ(x)

其中,ϕi(x)=xi,i=0,,Mϕi(x)=xi,i=0,…,M,矩陣 SS

S1=αI+βn=1Nϕ(xn)ϕ(xn)S−1=αI+β∑n=1Nϕ(xn)⊤ϕ(xn)

下圖粉紅色部分就是 Bayes 估計給出的結果,紅色曲線是 MAP 給出的結果。

In [3]:
def phi(x, M):
    return x[:,None] ** np.arange(M + 1)

N = 10

# 生成 0,1 之間等距的 N 個 數
x_tr = np.linspace(0, 1, N)

# 計算 t
t_tr = np.sin(2 * np.pi * x_tr) + 0.25 * np.random.randn(N)

# 加正則項的解
M = 9
alpha = 5e-3
beta = 11.1
lam = alpha / beta

phi_x_tr = phi(x_tr, M)
A_0 = phi_x_tr.T.dot(phi_x_tr) + lam * np.eye(M+1)
y_0 = t_tr.dot(phi_x_tr)

# 求解 Aw=y
coeff = np.linalg.solve(A_0, y_0)[::-1]

f = np.poly1d(coeff)

# 繪圖

xx = np.linspace(0, 1, 500)

# Bayes估計的均值和標準差
S = np.linalg.inv(A_0 * beta)

m_xx = beta * phi(xx, M).dot(S).dot(y_0)
s_xx = np.sqrt(1 / beta + phi(xx, M).dot(S).dot(phi(xx, M).T).diagonal())


fig, ax = plt.subplots()
ax.plot(x_tr, t_tr, 'co')
ax.plot(xx, np.sin(2 * np.pi * xx), 'g')
ax.plot(xx, f(xx), 'r')
ax.fill_between(xx, m_xx-s_xx, m_xx+s_xx, color="pink")
ax.set_xlim(-0.1, 1.1)
ax.set_ylim(-1.5, 1.5)
ax.set_xticks([0, 1])
ax.set_yticks([-1, 0, 1])
ax.set_xlabel("$x$", fontsize="x-large")
ax.set_ylabel("$t$", fontsize="x-large")

plt.show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章