贝叶斯方法学习笔记(二)

贝叶斯方法学习笔记(二)

原文来自于知乎《你一定从未看过如此通俗易懂的马尔科夫链蒙特卡洛方法解读》。在这里只是将文章主要的核心知识点进行提炼汇总。

链接:你一定从未看过如此通俗易懂的马尔科夫链蒙特卡洛方法解读

一.马尔可夫链及其应用

​ 在蒙特卡洛方法中需要大量采样,构成合适的概率模型,而且需要对采样的随机变量要求其服从某些特定的概率分布,但是有时候满足这种随机分布的随机数是很难产生的,而马尔科夫链蒙特卡洛方法(MCMC)是一个很好的算法。

1.马尔可夫链定义

​ 考虑一个随机变量序列 X = { X 0 , X 1 , X 2 , . . . X t , . . . } X=\{X_0,X_1,X_2,...X_t,...\} X={X0,X1,X2,...Xt,...}, X t X_t Xt表示 t t t时刻的随机变量。每个 X t X_t Xt的取值相同,称为状态空间,表示为 S S S。既可以连续,又可以离散。当满足以下特性时称为马尔可夫链

​ 1.当 t ≥ 1 t \geq1 t1时,如果 X t X_t Xt仅仅只依赖 X 0 , X 1 X_0,X_1 X0,X1…, X t − 1 X_{t-1} Xt1,而与 { X 0 , X 1 , . . . X t − 2 } \{X_0,X_1,...X_{t-2}\} {X0,X1...Xt2}无关,即:
P ( X t ∣ X t − 1 , X t − 2 , . . . X t , . . . X 0 ) = P ( X t ∣ X t − 1 ) , t = 1 , 2.. P(X_t|X_{t-1},X_{t-2},...X_t,...X_0)=P(X_t|X_{t-1}),t=1,2.. P(XtXt1,Xt2,...Xt,...X0)=P(XtXt1),t=1,2..
​ 2.与此同时,在初始时刻的随机变量 X 0 X_0 X0遵循 P ( X 0 ) = π 0 P(X_0)=\pi_0 P(X0)=π0

​ 称 { X 0 , X 1 , . . . X t , . . . } \{X_0,X_1,...X_t,...\} {X0,X1,...Xt,...}为马尔可夫链,而 P ( X t ∣ X t − 1 ) P(X_t|X_{t-1}) P(XtXt1)称为马尔可夫链的转移概率分布

P ( X t ∣ X t − 1 ) P(X_t|X_{t-1}) P(XtXt1)与具体的时间 t t t无关时,称为时间齐次的马尔可夫链

2.状态转移矩阵和状态分布

​ 1.定义 P m × n P_{m\times n} Pm×n状态转移矩阵,其中 p i j = P ( X t = i ∣ X t − 1 = j ) p_{ij}=P(X_t = i|X_{t-1}=j) pij=P(Xt=iXt1=j)

​ 2.定义马尔可夫链在 t t t时刻的概率分布称为该时刻的状态分布 π ( t ) = ( π 0 ( t ) , π 1 ( t ) , . . . , π n ( t ) ) T \pi(t)=(\pi_0(t),\pi_1(t),...,\pi_n(t))^T π(t)=(π0(t),π1(t),...,πn(t))T,其中有:
π i ( t ) = P ( X t = i ) , i = 1 , 2... \pi_i(t)=P(X_t=i),i=1,2... πi(t)=P(Xt=i),i=1,2...
​ 3.不同时刻的状态分布呈现如下迭代关系:
π ( t + 1 ) = P π ( t ) \pi(t+1)=P\pi(t) π(t+1)=Pπ(t)

3.平稳分布及其存在条件

  1. 定义当时间 t t t足够长时,马尔可夫链的状态分布会收敛到一个常向量上,此时的状态分布称为平稳分布

  2. 给出一个马尔可夫链 X = { X 0 , X 1 , . . . X t , . . . } X=\{X_0,X_1,...X_t,...\} X={X0,X1,...Xt,...} t t t时刻的状态分布 π = ( π 1 , π 2 , . . . π n ) \pi=(\pi_1,\pi_2,...\pi_n) π=(π1,π2,...πn) X X X的平稳分布的条件是, π \pi π是方程 π = P π \pi=P\pi π=Pπ的解,即满足:
    x i = ∑ j p i j x j , i = 1 , 2... n , x i , j ≥ 0 ∑ i x i = 1 x_i=\sum_{j}p_{ij}x_j,i=1,2...n,x_{i,j} \geq 0\\ \sum_ix_i = 1 xi=jpijxj,i=1,2...n,xi,j0ixi=1

  3. 例如:当 π ( 0 ) = ( 0.5 , 0.3 , 0.2 ) T \pi(0)=(0.5,0.3,0.2)^T π(0)=(0.5,0.3,0.2)T,转移矩阵为 P = ( 0.5 , 0.5 , 0.25 0.25 , 0 , 0.25 0.25 , 0.5 , 0.5 ) P=\begin{pmatrix}0.5,0.5,0.25\\0.25,0,0.25\\0.25,0.5,0.5\end{pmatrix} P=0.5,0.5,0.250.25,0,0.250.25,0.5,0.5,求平稳分布:

    import numpy as np
    import matplotlib.pyplot as plt
    start_matrix = np.array([[0.5],[0.3],[0.2]])
    transfer_matrix = np.array([[0.5,0.5,0.25],[0.25,0,0.25],[0.25,0.5,0.5]])
    init_matrix = start_matrix
    next_matrix = []
    eps = 1e-5
    error = 1
    value1_matrix = []
    value2_matrix = []
    value3_matrix = []
    Numbers = 0
    while error>eps:
        next_matrix = np.dot(transfer_matrix,init_matrix)
        error = np.linalg.norm(next_matrix - init_matrix)
        init_matrix = next_matrix
        value1_matrix.append(init_matrix[0][0])
        value2_matrix.append(init_matrix[1][0])
        value3_matrix.append(init_matrix[2][0])
        Numbers += 1
    print(Numbers)
    print(init_matrix)
    plt.plot(range(0,Numbers),value1_matrix,'blue',label = 'first')
    plt.plot(range(0,Numbers),value2_matrix,'red',label = 'second')
    plt.plot(range(0,Numbers),value3_matrix,'yellow',label = 'third')
    plt.xlabel("Numbers")
    plt.ylabel("Probability")
    plt.title("The Markov Chain")
    plt.legend()
    plt.show()
    

在这里插入图片描述

4.马尔可夫链的性质

​ 1.不可约:从任意状态出发,经过充分长时间后,可以到达任意状态。

给定一个马尔可夫链 X = { X 0 , X 1 , . . . X t , . . . } X=\{X_0,X_1,...X_t,...\} X={X0,X1,...Xt,...},对于 ∀ \forall 状态 i , j ∈ S i,j\in S i,jS, ∃ t , P ( X t = i ∣ X 0 = j ) > 0 \exists t,P(X_t=i|X_0=j)>0 t,P(Xt=iX0=j)>0

​ 2.非周期:

给定一个马尔可夫链 X = { X 0 , X 1 , . . . X t , . . . } X=\{X_0,X_1,...X_t,...\} X={X0,X1,...Xt,...},对于状态 i ∈ S i\in S iS,从 t = 0 t=0 t=0,状态 i i i出发, t t t时刻返回状态的所有时间长 { t : P ( X t = i ∣ X 0 = i ) > 0 } \{t:P(X_t=i|X_0=i)>0\} {t:P(Xt=iX0=i)>0}的最大公约数为1.

​ 3.遍历定理

​ 不可约且非周期的有限状态马尔可夫链,有唯一平稳分布存在。

5.可逆马尔可夫链

定义:给定马尔可夫链 X = { X 0 , X 1 , . . . X t , . . . } X=\{X_0,X_1,...X_t,...\} X={X0,X1,...Xt,...},如果有状态分布 ( π 1 , π 2 , . . ) (\pi_1,\pi_2,..) (π1,π2,..) ∀ i , j ∈ S , ∀ t \forall i,j\in S,\forall t i,jS,t满足:
P ( X t = i ∣ X t − 1 = j ) π j = P ( X t = j ∣ X t − 1 = i ) π i , i = 1 , 2 , . . . P(X_t=i|X_{t-1}=j)\pi_j=P(X_t=j|X_{t-1}=i)\pi_i,i=1,2,... P(Xt=iXt1=j)πj=P(Xt=jXt1=i)πi,i=1,2,...
​ 称之为 X X X的可逆马尔可夫链,上式为细致平衡方程

定理:满足细致平衡方程的状态分布就是马氏链的平稳分布

二.马尔科夫链蒙特卡洛方法(MCMC)

1.马尔可夫链蒙特卡洛方法的基本知识

​ 遇到多元变量的随机分布以及复杂的概率密度,需要用马尔可夫链蒙特卡洛方法(MCMC)。

每个时刻在这个马尔可夫链上进行随机游走一次,就可以得到一个样本。根据遍历定理,当时间趋于无穷时,样本的分布趋近平稳分布,样本的函数均值趋近函数的数学期望。

​ 当时间足够长时 ( t > m ) (t>m) (t>m)时,在之后的时间 ( t < n ) (t<n) (t<n)随机游走可以得到样本集合 { X m + 1 , X m + 2 , . . . X n } \{X_{m+1},X_{m+2},...X_n\} {Xm+1,Xm+2,...Xn}就是目标概率的抽样结果,而遍历之后的均值就是其数学期望:
E f = 1 n − m ∑ i = m + 1 n f ( X i ) Ef = \frac{1}{n-m}\sum_{i=m+1}^{n}f(X_i) Ef=nm1i=m+1nf(Xi)
​ 关键问题是:

  • 如果给了目标分布 p ( x ) p(x) p(x),相关的马尔可夫链怎么构造?
  • 假设收敛的步数为 m m m,迭代 m m m步后收敛,总迭代数 n n n m , n = ? m,n=? m,n=?

2.MCMC的基本步骤

Step1:构造一个 M C MC MC,使得其平稳分布为目标分布 p ( x ) p(x) p(x)

Step2:从初始分布$ X_0 , 用 构 造 的 ,用构造的 ,MC$游走,产生样本序列:
{ X 0 , X 1 , . . . X t , . . . } \{X_0,X_1,...X_t,...\} {X0,X1,...Xt,...}

Step3:遍历定理,确定 m , n m,n m,n,得到平稳样本集合: { X m + 1 , X m + 2 , . . . X t , . . . X n } \{X_{m+1},X_{m+2},...X_t,...X_n\} {Xm+1,Xm+2,...Xt,...Xn},求得 f ( x ) f(x) f(x)的均值 E f Ef Ef,由辛钦大数定律
E f = 1 n − m ∑ i = m + 1 n f ( X i ) Ef = \frac{1}{n-m}\sum_{i=m+1}^{n}f(X_i) Ef=nm1i=m+1nf(Xi)

3.构造方法

​ 构造这样一个 M C MC MC的关键点是求出状态转移矩阵 P P P

​ 因为满足细致平衡方程的状态分布就是该马尔可夫链的平稳分布 P π = π P\pi=\pi Pπ=π,所以找到矩阵 P P P即可,即满足:
π i P j i = π j P i j \pi_iP_{ji}=\pi_jP_{ij} πiPji=πjPij
​ 所以最关键的问题是找到一个匹配上述等式 P P P

​ 若对于一个任意的马尔可夫状态转移矩阵 Q i j Q_{ij} Qij,构造一个 α i j \alpha_{ij} αij α j i \alpha_{ji} αji,可以使得:
π i Q j i α j i = π j Q i j α i j \pi_iQ_{ji}\alpha_{ji}=\pi_jQ_{ij}\alpha_{ij} πiQjiαji=πjQijαij
​ 要使得上式子恒成立,就要取:
α j i = π j Q i j α i j = π i Q j i \alpha_{ji}=\pi_jQ_{ij}\\ \alpha_{ij}=\pi_iQ_{ji} αji=πjQijαij=πiQji
​ 这样可以得到满足细致平衡方程 P P P:
P j i = Q j i α j i = π j Q i j Q j i P i j = Q i j α i j = π j Q i j Q j i P_{ji}=Q_{ji}\alpha_{ji}=\pi_jQ_{ij}Q_{ji}\\ P_{ij}=Q_{ij}\alpha_{ij}=\pi_jQ_{ij}Q_{ji} Pji=Qjiαji=πjQijQjiPij=Qijαij=πjQijQji
α i j : \alpha_{ij}: αij:接受率,取值在 [ 0 , 1 ] [0,1] [0,1]之间,为一个概率值。

Q Q Q平稳分布建议分布,可以根据上式求出状态转移矩阵 P P P

4.Metropolis-Hastings算法

改进的 M C M C MCMC MCMC方法:

Step1: I n p u t : Input: Input:状态转移矩阵 Q Q Q,平稳分布 π \pi π,转移次数阈值 m m m,需要的样本个数 n n n

Step2:采样一个初始状态 X 0 X_0 X0

Step3: f o r for for i = 0 → ( n + m ) i = 0\rightarrow(n+m) i=0(n+m)

​ 从 M C MC MC ( Q ) (Q) (Q)中游走一次采样一个 x ∗ x_* x

​ 产生随机数 u ∼ U ( 0 , 1 ) u\sim U(0,1) uU(0,1)

i f if if u < α x ∗ , x i = m i n { 1 , π x ∗ Q x i , x ∗ π x i Q x ∗ , x i } u<\alpha_{x_*,x_i}=min\{ 1,\frac{\pi_{x_*}Q_{x_i,x_*}}{\pi_{x_i}Q_{x_*,x_i}}\} u<αx,xi=min{1,πxiQxxiπxQxi,x}

x i → x ∗ x_i\rightarrow x_* xix

x i + 1 = x ∗ x_{i+1}=x_* xi+1=x

e l s e : else: else:

x i + 1 = x i x_{i+1}=x_i xi+1=xi

o u t p u t : output: output:样本 ( x m , x m + 1 , . . . x n + m − 1 ) (x_m,x_{m+1},...x_{n+m-1}) (xm,xm+1,...xn+m1)即是平稳分布的样本集

o u t p u t : output: output:相应的 E f p ( x ) = 1 n − m ∑ i = m + 1 n f ( x i ) Ef_{p(x)}=\frac{1}{n-m}\sum_{i=m+1}^nf(x_i) Efp(x)=nm1i=m+1nf(xi)

如果选取对称的状态转移矩阵:可以简化 α j , i = m i n { 1 , π j π i } \alpha_{j,i}=min\{1,\frac{\pi_j}{\pi_i}\} αj,i=min{1,πiπj}

5.Metropolis-Hastings的代码实现:

如果要生成一个 a = 2.3 , b = 0.6 a=2.3,b=0.6 a=2.3,b=0.6 β \beta β分布。
f ( x , a , b ) = Γ ( a + b ) x a − 1 ( 1 − x ) b − 1 Γ ( a ) Γ ( b ) f(x,a,b)=\frac{\Gamma(a+b)x^{a-1}(1-x)^{b-1}}{\Gamma(a)\Gamma(b)} f(x,a,b)=Γ(a)Γ(b)Γ(a+b)xa1(1x)b1
其中 Q j , i Q_{j,i} Qj,i是以 i i i为均值,方差为 1 1 1的正态分布在 j j j处的概率密度的值:

import random
import math
from scipy.stats import beta
from scipy.stats import norm
import matplotlib.pyplot as plt

a, b = 2, 0.6

def norm_dist_prob(theta):
    y = beta(a, b).pdf(theta)
    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])))   #alpha值

    u = random.uniform(0, 1)
    if u < alpha:
        pi[t] = pi_star[0]
    else:
        pi[t] = pi[t - 1]


plt.scatter(pi, beta(a, b).pdf(pi),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()

在这里插入图片描述

代码来自:你一定从未看过如此通俗易懂的马尔科夫链蒙特卡洛方法解读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值