概率论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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章