简述
蒙特卡罗方法是一种用多次取样来逐渐逼近样本真实分布的方法。
另外蒙特卡罗并不是人的名字,而是位于摩纳哥的一个赌场的名字。
简单的例子
最经典的例子应该是几何概型中的算π \pi π 的数值。也就是高中课本上的撒豆子问题。
通过多次随机取样,取样点会随机分布在一个正方形的区域里,然后在该区域中画圆,就会是样本分成两部分。一部分在圆内,另一部分在圆外。然后通过算圆内的样本数占总样本数的比例可以近似算的圆的面积,最后通过圆面积公式能算得π \pi π 的取值。
实操
1 4 S = 1 4 π R 2 = n N n : 圆内区域的样本数 N : 样本总数 \frac{1}{4}S =\frac{1}{4}\pi R^{2} = \frac{n}{N} \\ n:圆内区域的样本数 \\ N:样本总数
4 1 S = 4 1 π R 2 = N n n : 圆内区域的样本数 N : 样本总数
import random
sampleNum = 10000
counter = 0
plt. figure( figsize= ( 8 , 8 ) )
x1 = list ( )
y1 = list ( )
x2 = list ( )
y2 = list ( )
for i in range ( sampleNum) :
x = random. random( )
y = random. random( )
if x** 2 + y** 2 < 1 :
counter += 1
x1. append( x)
y1. append( y)
else :
x2. append( x)
y2. append( y)
print ( 4 * counter/ sampleNum)
plt. scatter( x2, y2, color= 'b' )
plt. scatter( x1, y1, color= 'r' )
plt. show( )
随着s a m p l e N u m sampleNum s am pl e N u m 的增大,最终结果应该会越来越接近3.14。
蒙特卡罗求积分
对于一个函数f ( x ) f(x) f ( x ) ,我们想在求这个函数在x ∈ [ a , b ] x\in [a, b] x ∈ [ a , b ] 上的积分。我们会发现它的积分可能会比较难显式地求出来。这个时候我们可以通过蒙特卡罗的方法将他取样出来。
比如说我们现在打算求f ( x ) f(x) f ( x ) 的积分,姑且假定在区间x ∈ [ a , b ] x \in [a, b] x ∈ [ a , b ] 上,f ( x ) ≥ 0 f(x) \ge 0 f ( x ) ≥ 0 。此时,我们可以设定一个上界U ≥ s u p x ∈ [ a , b ] f ( x ) U \ge \mathrm{sup}_{x \in [a, b]} f(x) U ≥ sup x ∈ [ a , b ] f ( x ) 。
然后随机从均匀分布X ∼ U n i f ( a , b ) X \sim \mathrm{Unif}(a, b) X ∼ Unif ( a , b ) 和Y ∼ U n i f ( 0 , U ) Y \sim \mathrm{Unif}(0, U) Y ∼ Unif ( 0 , U ) 上采样{ x i , x j } \{x_{i}, x_{j}\} { x i , x j } 。当样本数量足够大的时候,
∫ a b f ( x ) d x = ∑ ( x i , y i ) δ ( y i ≤ f ( x i ) ) N t o l \int_{a}^{b}f(x)dx = \frac{\sum_{(x_{i}, y_{i})}\delta_{(y_{i} \le f(x_{i}))}}{N_{tol}}
∫ a b f ( x ) d x = N t o l ∑ ( x i , y i ) δ ( y i ≤ f ( x i ))
上面的过程中,我们需要对两个变量进行采样,那么是否可以只对一个变量进行采样的方法呢?
回想一下黎曼积分的思想,我们可以将积分看作在x x x 轴上进行均匀地切割,然后把对应的函数值加在一起。基于类似的思想,我们可以只对X ∼ U n i f ( a , b ) X\sim \mathrm{Unif}(a, b) X ∼ Unif ( a , b ) 进行采样,采样结果记作{ x i } N \{x_{i}\}_{N} { x i } N 。
此时,我们可以
∫ a b f ( x ) d x = ∑ i N f ( x i ) b − a N , \int_{a}^{b} f(x) dx = \sum_{i}^{N}f(x_{i}) \frac{b-a}{N},
∫ a b f ( x ) d x = i ∑ N f ( x i ) N b − a ,
其中b − a N \frac{b-a}{N} N b − a 可以看作均匀切割后的每一段的长度,其实可以对应积分中的d x dx d x 。
通过这种方法,我们不再需要对Y Y Y 进行采样。
蒙特卡罗求期望
对于一个函数f ( x ) f(x) f ( x ) ,我们想在求这个函数在x x x 上的期望E x ∼ π ( x ) [ f ( x ) ] \mathbb{E}_{x\sim\pi(x)}[f(x)] E x ∼ π ( x ) [ f ( x )] ,其中π ( x ) \pi(x) π ( x ) 是随机变量X X X 服从的分布的概率密度函数或者分布律。
根据期望的定义我们有
E x ∼ π ( x ) [ f ( x ) ] = ∫ x π ( x ) f ( x ) d x . \mathbb{E}_{x\sim \pi(x)}[f(x)] = \int_{x}\pi(x)f(x) dx.
E x ∼ π ( x ) [ f ( x )] = ∫ x π ( x ) f ( x ) d x .
假设我们对X X X 进行采样,样本记作{ x i } N \{x_{i}\}_{N} { x i } N 。
根据大数定律,则有
E x ∼ π ( x ) [ f ( x ) ] = 1 N ∑ i N f ( x i ) . \mathbb{E}_{x\sim \pi(x)}[f(x)] = \frac{1}{N}\sum_{i}^{N}f(x_{i}).
E x ∼ π ( x ) [ f ( x )] = N 1 i ∑ N f ( x i ) .
举例来讲,如果现在X ∼ U n i f ( a , b ) X \sim \mathrm{Unif}(a, b) X ∼ Unif ( a , b ) ,
那么
E x ∼ π ( x ) [ f ( x ) ] = ∫ x 1 b − a f ( x ) d x = 1 N ∑ i N f ( x i ) . \mathbb{E}_{x\sim \pi(x)}[f(x)] = \int_{x}\frac{1}{b-a}f(x) dx = \frac{1}{N}\sum_{i}^{N}f(x_{i}).
E x ∼ π ( x ) [ f ( x )] = ∫ x b − a 1 f ( x ) d x = N 1 i ∑ N f ( x i ) .
重要性采样
有的时候直接从目标分布(注意,这个分布是已知的)采样非常困难,代价高昂,或者一定样本的到的精度不高时。
我们可以引入一个容易采样的建议分布(Proposal Distribution),并赋予每个样本相应的权重,来无偏地估计目标分布的期望值。
假设我们选择的易于采样的建议分布的pdf为q ( x ) q(x) q ( x ) ,
E x ∼ π ( x ) [ f ( x ) ] = ∫ x π ( x ) f ( x ) d x = ∫ x q ( x ) π ( x ) q ( x ) f ( x ) d x = E x ∼ q ( x ) [ π ( x ) q ( x ) f ( x ) ] . \begin{aligned}
\mathbb{E}_{x\sim \pi(x)}[f(x)] &= \int_{x}\pi(x)f(x) dx\\
&= \int_{x}q(x)\frac{\pi(x)}{q(x)}f(x) dx \\
&= \mathrm{E}_{x \sim q(x)}\left[\frac{\pi(x)}{q(x)}f(x)\right].
\end{aligned}
E x ∼ π ( x ) [ f ( x )] = ∫ x π ( x ) f ( x ) d x = ∫ x q ( x ) q ( x ) π ( x ) f ( x ) d x = E x ∼ q ( x ) [ q ( x ) π ( x ) f ( x ) ] .
如果我们把π ( x ) q ( x ) \frac{\pi(x)}{q(x)} q ( x ) π ( x ) 定义为w ( x ) w(x) w ( x ) ,那么
E x ∼ q ( x ) [ π ( x ) q ( x ) f ( x ) ] = E x ∼ q ( x ) [ w ( x ) f ( x ) ] \mathrm{E}_{x \sim q(x)}\left[\frac{\pi(x)}{q(x)}f(x)\right] = \mathrm{E}_{x \sim q(x)}\left[w(x)f(x)\right]
E x ∼ q ( x ) [ q ( x ) π ( x ) f ( x ) ] = E x ∼ q ( x ) [ w ( x ) f ( x ) ]
可以看作我们在建议分布上采样的时候,目标函数f ( x ) f(x) f ( x ) 的值要乘上一个权重w ( x ) w(x) w ( x ) 。
对于不同的x x x ,权重不同,说明对应的f ( x ) f(x) f ( x ) 的重要性不同,这个便是该小节标题中“重要性”的来源。
对X X X 进行采样之后,再次根据大数定律,
E x ∼ q ( x ) [ w ( x ) f ( x ) ] = 1 N ∑ i N w ( x i ) f ( x i ) . \mathrm{E}_{x \sim q(x)}\left[w(x)f(x)\right] = \frac{1}{N}\sum_{i}^{N}w(x_{i})f(x_{i}).
E x ∼ q ( x ) [ w ( x ) f ( x ) ] = N 1 i ∑ N w ( x i ) f ( x i ) .
与上面的直观理解相似,“重要性”体现在,对于不同x i x_{i} x i ,权重w ( x i ) w(x_{i}) w ( x i ) 不同,f ( x i ) f(x_{i}) f ( x i ) 的”贡献“自然不同。
对上面的式子中,我们需要注意的是,目标分布π ( x ) \pi(x) π ( x ) ,我们选取的建议分布q ( x ) q(x) q ( x ) 和目标函数f ( x ) f(x) f ( x ) 都是已知的。我们只是想通过采样之后得到f ( x ) f(x) f ( x ) 的期望。
拒绝采样
重要性采样是对目标函数f ( x ) f(x) f ( x ) 添加权重,但我们的得到的样本{ x i } N \{x_{i}\}_{N} { x i } N 是服从建议分布的,而不是服从目标分布。
那我们是否有办法真正的得到从目标分布中采样的来的样本呢?
答案是肯定的。
因为目标分布的直接采样困难,
在拒绝采样的过程中,我们还是要先选取一个易于采样的建议分布q ( x ) q(x) q ( x ) 。
与重要性采样不同的是,我们还要选取一个常数M M M ,使得
M ⋅ q ( x ) ≥ π ( x ) . M\cdot q(x) \ge \pi(x).
M ⋅ q ( x ) ≥ π ( x ) .
自然,我们接下来应该做的是直接从q ( x ) q(x) q ( x ) 中采样。
在重要性采样中,我们对于没一个采到的样本都保留下来,进行利用。
而在拒绝采样中,对于采到的样本x i x_{i} x i ,我们以α a c c e p t \alpha_{\mathrm{accept}} α accept 的概率进行保留。自然以α r e j e c t = 1 − α a c c e p t \alpha_{\mathrm{reject}} = 1 - \alpha_{\mathrm{accept}} α reject = 1 − α accept 的概率丢弃。
对于x i x_{i} x i 接受概率的计算:
α a c c e p t = π ( x i ) M ⋅ q ( x i ) . \alpha_{\mathrm{accept}} = \frac{\pi(x_{i})}{M\cdot q(x_{i})}.
α accept = M ⋅ q ( x i ) π ( x i ) .
为了实现概率接受和概率丢弃,我们可以随机生成一个服从U n i f ( 0 , 1 ) \mathrm{Unif}(0, 1) Unif ( 0 , 1 ) 的随机数u u u ,如果u u u 落在[ 0 , α a c c e p t ] [0, \alpha_{\mathrm{accept}}] [ 0 , α accept ] ,x i x_{i} x i 就会被接受,反之,如果u ∈ ( α a c c e p t , 1 ] u \in (\alpha_{\mathrm{accept}}, 1] u ∈ ( α accept , 1 ] ,x i x_{i} x i 便会被丢弃。
拒绝采样的直觉理解是很简单的,
图中,p ~ ( z ) \tilde{p}(z) p ~ ( z ) 便是目标分布(即,本文中的π ( x ) \pi(x) π ( x ) )。k k k 和q ( z ) q(z) q ( z ) 为选取的M M M 和q ( x ) q(x) q ( x ) 。
对与样本z 0 z_{0} z 0 而言,z 0 z_0 z 0 在p ~ ( z ) \tilde{p}(z) p ~ ( z ) 中被采集到的可能性比上在k q ( z ) kq(z) k q ( z ) 中被采集到的可能性应该为两个pdf在z 0 z_{0} z 0 处的高度比。
MCMC
拒绝采样适用于低维简单分布,而 MCMC 专为高维复杂分布设计,通过构建马尔可夫链使其平稳分布收敛于目标分布。
MCMC采样很神奇的点在于,每次采样的时候不是完全独立,而是上一个采样的样本会对下一采样的样本有一定约束。
马尔可夫链
对于一组随机变量X = { X t } t ≥ 0 \boldsymbol{X} = \{X_{t}\}_{t \ge 0} X = { X t } t ≥ 0 ,其中t t t 代表时刻,如果有
P ( X t ∣ { X t } 0 ≤ t ≤ t − 1 ) = P ( X t ∣ X t − 1 ) , P(X_{t} \mid \{X_{t}\}_{0 \le t \le t-1}) = P(X_{t} \mid X_{t-1}),
P ( X t ∣ { X t } 0 ≤ t ≤ t − 1 ) = P ( X t ∣ X t − 1 ) ,
那么,称X = { X t } t ≥ 0 \boldsymbol{X} = \{X_{t}\}_{t \ge 0} X = { X t } t ≥ 0 为马尔可夫链。
进一步,P ( X t ∣ X t − 1 ) P(X_{t}\mid X_{t-1}) P ( X t ∣ X t − 1 ) 被称为X t − 1 X_{t-1} X t − 1 到X t X_{t} X t 的转移概率分布。
例如,我们在这里假设X ≤ t = { X t } ≤ t ∈ [ 1 , 2 , 3 ] ( t + 1 ) \boldsymbol{X}_{\le t} = \{X_{t}\}_{\le t} \in [1, 2, 3]^{(t+1)} X ≤ t = { X t } ≤ t ∈ [ 1 , 2 , 3 ] ( t + 1 ) ,
我们定义
P = [ p 11 p 12 p 13 p 21 p 22 p 23 p 31 p 32 p 33 ] , \begin{aligned}
\boldsymbol{P} =
\left[
\begin{array}{ccc}
p_{11} & p_{12} & p_{13} \\
p_{21} & p_{22} & p_{23} \\
p_{31} & p_{32} & p_{33}
\end{array}
\right],
\end{aligned}
P = p 11 p 21 p 31 p 12 p 22 p 32 p 13 p 23 p 33 ,
其中,P j i = P ( X t = j ∣ X t − 1 = i ) P_{ji} = P(X_{t}=j \mid X_{t-1}=i) P j i = P ( X t = j ∣ X t − 1 = i ) 。
我们称上述的矩阵为转移概率矩阵。
我们进一步定义
π ( t ) = [ π 1 ( t ) , π 2 ( t ) , π 3 ( t ) ] ⊤ , \pi(t) = [\pi_{1}(t), \pi_{2}(t), \pi_{3}(t)]^{\top},
π ( t ) = [ π 1 ( t ) , π 2 ( t ) , π 3 ( t ) ] ⊤ ,
为t t t 时刻的状态分布,
其中π i ( t ) = P ( X t = i ) \pi_{i}(t) = P(X_{t}=i) π i ( t ) = P ( X t = i ) 。
π ( t ) = [ π 1 ( t ) , π 2 ( t ) , π 3 ( t ) ] \pi(t) = [\pi_{1}(t), \pi_{2}(t), \pi_{3}(t)] π ( t ) = [ π 1 ( t ) , π 2 ( t ) , π 3 ( t )] 即为t t t 时刻目标分布的分布律(这里考虑的是离散的情况)。
同时,π t \pi_{t} π t 还可以写作
π ( t ) ⊤ = π ( 0 ) ⊤ P t . \pi(t)^{\top} = \pi(0)^{\top}P^{t}.
π ( t ) ⊤ = π ( 0 ) ⊤ P t .
我们都知道,对于一个转移过程,若
π ( t ) ⊤ = π ( t ) ⊤ P , \pi(t)^{\top} = \pi(t)^{\top}P,
π ( t ) ⊤ = π ( t ) ⊤ P ,
则称π ( t ) \pi(t) π ( t ) 是马尔可夫链的平稳分布。
一个马尔可夫链拥有唯一平稳分布通常需要具备一下三点性质:
不可约性(Irreducible):系统中的任何一个状态都可以通过有限步转移到达其他所有状态。
非周期性(Aperiodic):系统从某状态出发,返回该状态的可能步数不具有公约数,避免了系统出现死循环振荡。
正常返性(Positive Recurrent):系统平均返回到某一状态的时间是有限的。
最后,我们定义一种特殊的马尔可夫链。
对于任意时刻t t t ,如果一个马尔可夫链满足细致平衡方程(detailed balance equation):
∀ i ∀ j , p j i π i = p i j π j , \forall i \forall j, \qquad p_{ji}\pi_{i} = p_{ij}\pi_{j},
∀ i ∀ j , p j i π i = p ij π j ,
则称该马尔可夫链为可逆马尔可夫链。
定理 1 满足细致平衡方程的状态分布π \pi π 是该马尔可夫链的平稳分布。
MCMC采样
如定理1 所言,我们只要能找到一个满足细致平衡方程的P \boldsymbol{P} P ,那么,马尔可夫转移每次选择的状态(在本文中为1 or 2 or 3)可以作为采的样本,并且该样本符合目标分布π \pi π 。
接下来的问题变成如何去寻找满足条件的P \boldsymbol{P} P 。
我们可以先任取一个转移矩阵Q \boldsymbol{Q} Q 。此时我们一般有
π i q j i ≠ π j q i j . \pi_{i}q_{ji} \ne \pi_{j}q_{ij}.
π i q j i = π j q ij .
但我们可以在不等式两边进行适当缩放,然后不等式变为等式
π i q j i α j i = π j q i j α i j , \pi_{i}q_{ji}\alpha_{ji} = \pi_{j}q_{ij}\alpha_{ij},
π i q j i α j i = π j q ij α ij ,
其中α j i \alpha_{ji} α j i 和α i j \alpha_{ij} α ij 为缩放系数。
进一步,要是等式恒成立,我们可以简单地令
α j i = π j q i j , α i j = π i q j i . \alpha_{ji} = \pi_{j}q_{ij}, \qquad \alpha_{ij} = \pi_{i}q_{ji}.
α j i = π j q ij , α ij = π i q j i .
此时,等式两边都为π j ⋅ q i j ⋅ π i ⋅ q j i \pi_{j}\cdot q_{ij}\cdot \pi_{i}\cdot q_{ji} π j ⋅ q ij ⋅ π i ⋅ q j i 。
最后,如果我们把
α i q j i \alpha_{i}q_{ji} α i q j i 看作q ~ j i \tilde{q}_{ji} q ~ j i ,α j q i j \alpha_{j}q_{ij} α j q ij 看作q ~ i j \tilde{q}_{ij} q ~ ij ,便得到了细致平衡方程
π i q ~ j i = π j q ~ i j . \pi_{i}\tilde{q}_{ji} = \pi_{j}\tilde{q}_{ij}.
π i q ~ j i = π j q ~ ij .
注意这里的平稳分布是π i \pi_{i} π i 和π j \pi_{j} π j ,但是q ~ j i \tilde{q}_{ji} q ~ j i 和q ~ i j \tilde{q}_{ij} q ~ ij 并未进行归一化,所以应该不能是一个合理的转移矩阵。
那么,我们是否还可以用Q ~ \widetilde{\boldsymbol{Q}} Q 来进行采样呢?
答案是可以的。
实际上,我们可以这么定义p j i p_{ji} p j i 和q ~ j i \tilde{q}_{ji} q ~ j i :
p j i = { q ~ j i , i ≠ j , q ~ j i + ( 1 − ∑ j ∈ s u p p ( X ) q ~ j i ) , j = i . \begin{aligned}
p_{ji} =
\left\{
\begin{array}{ll}
\tilde{q}_{ji}, & i \ne j, \\
\tilde{q}_{ji} + (1 - \sum_{j \in \mathrm{supp}(\boldsymbol{X})}\tilde{q}_{ji}), & j = i.
\end{array}
\right.
\end{aligned}
p j i = { q ~ j i , q ~ j i + ( 1 − ∑ j ∈ supp ( X ) q ~ j i ) , i = j , j = i .
等价的
p j i = q ~ j i + ( 1 − ∑ j ∈ s u p p ( X ) q ~ j i ) δ i = j . p_{ji} = \tilde{q}_{ji} + (1 - \sum_{j \in \mathrm{supp}(\boldsymbol{X})}\tilde{q}_{ji})\delta_{i=j}.
p j i = q ~ j i + ( 1 − j ∈ supp ( X ) ∑ q ~ j i ) δ i = j .
直觉上,我们可以认为当两次采样的状态(值)不一样的时候,直接用q ~ j i \tilde{q}_{ji} q ~ j i 代替p j i p_{ji} p j i ,而当i = j i=j i = j 的时候,我们在用q ~ i i \tilde{q}_{ii} q ~ ii 代替p i i p_{ii} p ii 的基础上,还加入了让∑ j ∈ s u p p ( X ) q ~ j i \sum_{j \in \mathrm{supp}(\boldsymbol{X})}\tilde{q}_{ji} ∑ j ∈ supp ( X ) q ~ j i 与1 1 1 的差值。
这样子我们便得到了一个归一化的p j i p_{ji} p j i 了。
至于这样的p j i p_{ji} p j i 是否满足细致平稳呢?
我们发现,对于任意π i \pi_{i} π i ,π j \pi_{j} π j ,f i , j f_{i, j} f i , j ,和f j , i f_{j,i} f j , i 都有
f i , j δ i = j π i = f j , i δ i = j π j . f_{i, j}\delta_{i=j}\pi_{i} = f_{j, i}\delta_{i=j}\pi_{j}.
f i , j δ i = j π i = f j , i δ i = j π j .
具体来说,当i ≠ j i \ne j i = j 时,上式必然成立。当i = j i = j i = j 的时候,f i , i π i = f j , j π j f_{i, i}\pi_{i} = f_{j, j}\pi_{j} f i , i π i = f j , j π j 也是必然成立的。
所以,当Q ~ \widetilde{\boldsymbol{Q}} Q 满足细致平衡条件的时候,多出来的i = j i=j i = j 的项并不影响P \boldsymbol{P} P 也满足细致平衡条件。
一言蔽之就是说,通过调整转移矩阵的对角线元素可以完成归一化,并且不影响细致平稳条件的成立。
Metropolis算法
接下来写一下到目前为止的算法。
我们的目标实在满足细致平衡条件的Q ~ \widetilde{\boldsymbol{Q}} Q 上采样,如果Q ~ \widetilde{\boldsymbol{Q}} Q 比较难以采样,我们便在容易采样的Q \boldsymbol{Q} Q 上采样。
注意,q ~ j i \widetilde{q}_{ji} q j i 和q j i {q}_{ji} q j i 差一个α j i \alpha_{ji} α j i 的倍数。
当我们通过q j i {q}_{ji} q j i 从状态i i i 选择状态j j j 的时候,如果i ≠ j i \ne j i = j ,我们会发现我们实际上需要的选择的概率为q ~ j i \tilde{q}_{ji} q ~ j i 。
与拒绝采样相似,α j i \alpha_{ji} α j i 可以被看作是一个接受概率。
换言之,当我们处于i i i 状态,而下一个被选择的状态是与i i i 不同的j j j 的时候,我们以概率α j i \alpha_{ji} α j i 接受这个选择,以1 − α j i 1-\alpha_{ji} 1 − α j i 的概率拒绝这个选择。
当我们拒绝选择状态j j j 的时候,我们会留在状态i i i ,即,有采样了一次i i i 。
需要注意的是,我们由状态i i i 到状态i i i 时的接受率并不是α i i \alpha_{ii} α ii 而是1 − α j i 1-\alpha_{ji} 1 − α j i 。
这就是之前所讲的,通过调整转移矩阵的对角线元素可以完成归一化,实现最终以p j i p_{ji} p j i 进行转移。
最后,Metropolis算法总结如下
Metropolis采样
初始状态的x 0 x_{0} x 0 , t时刻状态为x t x_{t} x t 。
通过如下流程采样样本x t + 1 x_{t+1} x t + 1 :
通过q t + 1 , t q_{t+1, t} q t + 1 , t 采样一个样本x t + 1 ∗ x^{*}_{t+1} x t + 1 ∗ 。
从U n i f ( 0 , 1 ) \mathrm{Unif}(0, 1) Unif ( 0 , 1 ) 中,生成一个随机数u u u 。
如果u ≤ α t + 1 , t u \le \alpha_{t+1, t} u ≤ α t + 1 , t ,x t + 1 ← α t + 1 , t ⋅ x t + 1 ∗ x_{t+1} \gets \alpha_{t+1, t} \cdot x^{*}_{t+1} x t + 1 ← α t + 1 , t ⋅ x t + 1 ∗ ;否则,x t + 1 ← x t x_{t+1} \gets x_{t} x t + 1 ← x t 。
这个算法与拒绝采样相似,但不完全一直。
拒绝采样中如果样本被拒绝那就是拒绝了,但Metropolis算法的话,会把原地踏步把目前的状态计入时刻t t t 的样本。
Metropolis-Hastings 采样
通过α j i \alpha_{ji} α j i 来接受拒绝下一个状态的选择其实会面临一个问题。
如果α j i \alpha_{ji} α j i 太小,那采样会一直原地踏步,无法对其他状态进行探索。
为了解决这个问题,我们先回到细致平稳方程
π i q j i α j i = π j q i j α i j . \pi_{i}q_{ji}\alpha_{ji} = \pi_{j}q_{ij}\alpha_{ij}.
π i q j i α j i = π j q ij α ij .
正如我前面所说,α j i \alpha_{ji} α j i 和α i j \alpha_{ij} α ij 是一个缩放,那么我们能否在这个式子的基础上,左右两边再同乘上一个常数c i c_{i} c i ,让c i ⋅ α j i c_{i}\cdot \alpha_{ji} c i ⋅ α j i 来作为接受率呢?
显然是可以的,但是接受率一定要是一个介于0到1之间的数,我们再乘上c i c_{i} c i 之后,c i ⋅ α j i c_{i}\cdot \alpha_{ji} c i ⋅ α j i 和c i ⋅ α i j c_{i}\cdot \alpha_{ij} c i ⋅ α ij 都不能超多一。
对于c i ⋅ α j i c_{i}\cdot \alpha_{ji} c i ⋅ α j i ,我们何时可以将它缩放到最大呢?
当c i ⋅ α j i = 1 c_{i}\cdot \alpha_{ji} = 1 c i ⋅ α j i = 1 或者c i ⋅ α i j = 1 c_{i}\cdot \alpha_{ij}=1 c i ⋅ α ij = 1 的时候。
令A j i : = c i ⋅ α j i \mathcal{A}_{ji}:=c_{i}\cdot \alpha_{ji} A j i := c i ⋅ α j i ,则有
A j i = { 1 , α j i ≥ α i j , π j q i j π i q j i , α j i < α i j . \begin{aligned}
\mathcal{A}_{ji} =
\left\{
\begin{array}{ll}
1, & \alpha_{ji} \ge \alpha_{ij},\\
\frac{\pi_{j}q_{ij}}{\pi_{i}q_{ji}}, & \alpha_{ji} < \alpha_{ij}.
\end{array}
\right.
\end{aligned}
A j i = { 1 , π i q j i π j q ij , α j i ≥ α ij , α j i < α ij .
最后,我们只需要让新的接受率
A j i = m i n ( 1 , π j q i j π i q j i ) \mathcal{A}_{ji} = \mathrm{min}(1, \frac{\pi_{j}q_{ij}}{\pi_{i}q_{ji}})
A j i = min ( 1 , π i q j i π j q ij )
就好。
如果,q i j = q j i q_{ij} = q_{ji} q ij = q j i ,
则
A j i = m i n ( 1 , π j π i ) \mathcal{A}_{ji} = \mathrm{min}(1, \frac{\pi_{j}}{\pi_{i}})
A j i = min ( 1 , π i π j )
Metropolis-Hastings 采样
初始状态的x 0 x_{0} x 0 , t时刻状态为x t x_{t} x t 。
通过如下流程采样样本x t + 1 x_{t+1} x t + 1 :
通过q t + 1 , t q_{t+1, t} q t + 1 , t 采样一个样本x t + 1 ∗ x^{*}_{t+1} x t + 1 ∗ 。
从U n i f ( 0 , 1 ) \mathrm{Unif}(0, 1) Unif ( 0 , 1 ) 中,生成一个随机数u u u 。
如果u ≤ A t + 1 , t = m i n ( 1 , π t + 1 q t , t + 1 π t q t + 1 , t ) u \le \mathcal{A}_{t+1, t}=\mathrm{min}(1, \frac{\pi_{t+1}q_{t, t+1}}{\pi_{t}q_{t+1, t}}) u ≤ A t + 1 , t = min ( 1 , π t q t + 1 , t π t + 1 q t , t + 1 ) ,x t + 1 ← α t + 1 , t ⋅ x t + 1 ∗ x_{t+1} \gets \alpha_{t+1, t} \cdot x^{*}_{t+1} x t + 1 ← α t + 1 , t ⋅ x t + 1 ∗ ;否则,x t + 1 ← x t x_{t+1} \gets x_{t} x t + 1 ← x t 。
一段M-H采样高斯分布的python 代码
import random
import math
from scipy. stats import norm
import matplotlib. pyplot as plt
def norm_dist_prob ( theta) :
y = norm. pdf( theta, loc= 10 , scale= 5 )
return y
T = 5000
pi = [ 0 for i in range ( T) ]
sigma = 1
t = 0
while t < T- 1 :
t = t + 1
pi_star = norm. rvs( loc= pi[ t - 1 ] , scale= sigma, size= 1 , random_state= None )
alpha = min ( 1 , ( norm_dist_prob( pi_star[ 0 ] ) / norm_dist_prob( pi[ t - 1 ] ) ) )
u = random. uniform( 0 , 1 )
if u < alpha:
pi[ t] = pi_star[ 0 ]
else :
pi[ t] = pi[ t - 1 ]
plt. scatter( pi, norm. pdf( pi, loc= 10 , scale= 5 ) , label= 'Target Distribution' , c= 'red' )
num_bins = 50
plt. hist( pi, num_bins, density= 1 , facecolor= 'green' , alpha= 0.7 , label= 'Samples Distribution' )
plt. legend( )
plt. show( )
吉布斯采样(Gibbs Sampling)
接下来,我们看看更现实的应用场景,高维数据的情况。
假设X t = { X t , 1 , X t , 2 , ⋯ , X t , d } \boldsymbol{X}_{t}= \{X_{t, 1}, X_{t, 2}, \cdots, X_{t, d}\} X t = { X t , 1 , X t , 2 , ⋯ , X t , d } 是一个d d d 维的随机变量。
Gibbs采样每个时刻t t t ,只对d d d 维中的一维进行采样。
比如说我们接下来要对第h h h 维采样,我们将时刻t + 1 t+1 t + 1 的样本记作X t + 1 = X t , [ X t , h = X t + 1 , h ] \boldsymbol{X}_{t+1} = \boldsymbol{X}_{t, [X_{t, h}=X_{t+1, h}]} X t + 1 = X t , [ X t , h = X t + 1 , h ]
,我们定义转移概率(这里的多维变量,我们用最稳妥的写法)为
q ( X t + 1 ∣ X t ) = P ( X t + 1 , h ∣ X t , − h ) = P ( X t , [ X t , h = X t + 1 , h ] ) P ( X t , − h ) , q(\boldsymbol{X}_{t+1} \mid \boldsymbol{X}_{t}) = P(X_{t+1, h} \mid \boldsymbol{X}_{t, -h})= \frac{P(\boldsymbol{X}_{t, [X_{t, h}=X_{t+1, h}]})}{P(\boldsymbol{X}_{t, -h})},
q ( X t + 1 ∣ X t ) = P ( X t + 1 , h ∣ X t , − h ) = P ( X t , − h ) P ( X t , [ X t , h = X t + 1 , h ] ) ,
其中X t , − h = X t ∖ { X t , h } \boldsymbol{X}_{t, -h} = \boldsymbol{X}_{t} \setminus \{X_{t, h}\} X t , − h = X t ∖ { X t , h } 。
这个式子意味着,我们每次固定第h h h 维以外的维度的取值,然后只更新第h h h 维的取值。
然后,我们定义接受率
A t + 1 , t : = m i n ( 1 , P ( X t + 1 ) q ( X t ∣ X t + 1 ) P ( X t ) q ( X t + 1 ∣ X t ) ) = m i n ( 1 , P ( X t , [ X t , h = X t + 1 , h ] ) P ( X t , h ∣ X t , − h ) P ( X t ) P ( X t , h ∣ X t , − h ) ) = m i n ( 1 , P ( X t , [ X t , h = X t + 1 , h ] ) P ( X t , h ∣ X t , − h ) P ( X t , − h ) P ( X t ) P ( X t , [ X t , h = X t + 1 , h ] ) ) = m i n ( 1 , P ( X t , [ X t , h = X t + 1 , h ] ) P ( X t ) P ( X t ) P ( X t , [ X t , h = X t + 1 , h ] ) ) = m i n ( 1 , 1 ) = 1. \begin{aligned}
\mathcal{A}_{t+1, t} &:= \mathrm{min}\left(1, \frac{P(\boldsymbol{X}_{t+1})q(\boldsymbol{X}_{t}\mid \boldsymbol{X}_{t+1})}{P(\boldsymbol{X}_{t})q(\boldsymbol{X}_{t+1}\mid \boldsymbol{X}_{t})}\right) \\
&= \mathrm{min}\left(1, \frac{P(\boldsymbol{X}_{t, [X_{t, h}=X_{t+1, h}]})P(X_{t, h} \mid \boldsymbol{X}_{t, -h})}{P(\boldsymbol{X}_{t})P(X_{t, h} \mid \boldsymbol{X}_{t, -h})}\right) \\
&= \mathrm{min}\left(1, \frac{P(\boldsymbol{X}_{t, [X_{t, h}=X_{t+1, h}]})P(X_{t, h} \mid \boldsymbol{X}_{t, -h})P(\boldsymbol{X}_{t, -h})}{P(\boldsymbol{X}_{t})P(\boldsymbol{X}_{t, [X_{t, h}=X_{t+1, h}]})}\right) \\
&= \mathrm{min}\left(1, \frac{P(\boldsymbol{X}_{t, [X_{t, h}=X_{t+1, h}]})P(X_{t})}{P(\boldsymbol{X}_{t})P(\boldsymbol{X}_{t, [X_{t, h}=X_{t+1, h}]})}\right) \\
&= \mathrm{min}(1, 1) \\
&= 1.
\end{aligned}
A t + 1 , t := min ( 1 , P ( X t ) q ( X t + 1 ∣ X t ) P ( X t + 1 ) q ( X t ∣ X t + 1 ) ) = min ( 1 , P ( X t ) P ( X t , h ∣ X t , − h ) P ( X t , [ X t , h = X t + 1 , h ] ) P ( X t , h ∣ X t , − h ) ) = min ( 1 , P ( X t ) P ( X t , [ X t , h = X t + 1 , h ] ) P ( X t , [ X t , h = X t + 1 , h ] ) P ( X t , h ∣ X t , − h ) P ( X t , − h ) ) = min ( 1 , P ( X t ) P ( X t , [ X t , h = X t + 1 , h ] ) P ( X t , [ X t , h = X t + 1 , h ] ) P ( X t ) ) = min ( 1 , 1 ) = 1.
所以,对于每一个时刻t t t 所作的选择,Gibbs采样都不做拒绝地将其作为样本保留下来。
Gibbs采样
初始状态为x 0 \boldsymbol{x}_{0} x 0 , t时刻状态的分布为x t \boldsymbol{x}_{t} x t 。
通过如下流程采样样本x t + 1 \boldsymbol{x}_{t+1} x t + 1 :
均匀的从[ d ] [d] [ d ] 中选取一个维度h h h 。
计算q ( X t + 1 ∣ X t ) = P ( X t , [ X t , h = X t , h ] ) P ( X t , − h ) q(\boldsymbol{X}_{t+1} \mid \boldsymbol{X}_{t})= \frac{P(\boldsymbol{X}_{t, [X_{t, h}=X_{t, h}]})}{P(\boldsymbol{X}_{t, -h})} q ( X t + 1 ∣ X t ) = P ( X t , − h ) P ( X t , [ X t , h = X t , h ] )
通过q ( X t + 1 ∣ X t ) q(\boldsymbol{X}_{t+1} \mid \boldsymbol{X}_{t}) q ( X t + 1 ∣ X t ) 采样第h h h 维的一个状态x t + 1 , h x_{t+1, h} x t + 1 , h 。
x t + 1 ← x t , [ x t , h = x t + 1 , h ] x_{t+1} \gets \boldsymbol x_{t, [x_{t, h}=x_{t+1, h}]} x t + 1 ← x t , [ x t , h = x t + 1 , h ] 。
最后一步,是将第d d d 维的数据替换成新采样的状态。
import random
import math
from scipy. stats import beta
from scipy. stats import norm
import matplotlib. pyplot as plt
from mpl_toolkits. mplot3d import Axes3D
from scipy. stats import multivariate_normal
samplesource = multivariate_normal( mean= [ 5 , - 1 ] , cov= [ [ 1 , 0.5 ] , [ 0.5 , 2 ] ] )
def p_ygivenx ( x, m1, m2, s1, s2) :
return ( random. normalvariate( m2 + rho * s2 / s1 * ( x - m1) , math. sqrt( 1 - rho ** 2 ) * s2) )
def p_xgiveny ( y, m1, m2, s1, s2) :
return ( random. normalvariate( m1 + rho * s1 / s2 * ( y - m2) , math. sqrt( 1 - rho ** 2 ) * s1) )
N = 5000
K = 20
x_res = [ ]
y_res = [ ]
z_res = [ ]
m1 = 5
m2 = - 1
s1 = 1
s2 = 2
rho = 0.5
y = m2
for i in range ( N) :
for j in range ( K) :
x = p_xgiveny( y, m1, m2, s1, s2)
y = p_ygivenx( x, m1, m2, s1, s2)
z = samplesource. pdf( [ x, y] )
x_res. append( x)
y_res. append( y)
z_res. append( z)
num_bins = 50
plt. scatter( x_res, norm. pdf( x_res, loc= 5 , scale= 1 ) , label= 'Target Distribution x' , c= 'green' )
plt. scatter( y_res, norm. pdf( y_res, loc= - 1 , scale= 2 ) , label= 'Target Distribution y' , c= 'orange' )
plt. hist( x_res, num_bins, density= 1 , facecolor= 'Cyan' , alpha= 0.5 , label= 'x' )
plt. hist( y_res, num_bins, density= 1 , facecolor= 'magenta' , alpha= 0.5 , label= 'y' )
plt. title( 'Histogram' )
plt. legend( )
plt. show( )
参考
https://spaces.ac.cn/archives/8084
https://zhuanlan.zhihu.com/p/253784711
Chatgpt