马尔可夫链蒙特卡洛法(MCMC)的原理讲解以及Metropolis-Hasting与Jibbs算法python实现

马尔可夫链

考虑一个随机变量的序列 X = { X 0 , X 1 , ⋯   , X t , ⋯   } X=\{X_0, X_1,\cdots,X_t,\cdots\} X={ X0,X1,,Xt,},这里 X t X_t Xt表示时刻 t t t的随机变量, t = 0 , 1 , 2 , ⋯ t=0,1,2,\cdots t=0,1,2,,每个随机变量 X t X_t Xt的取值集合相同,称为状态空间,表示为 S S S。随机变量可以是离散的,也可以是连续的,以上随机变量的序列构成随机过程(stochastic process)

马尔可夫性

P ( X t ∣ X 0 , X 1 , ⋯   , X t − 1 ) = P ( X t ∣ X t − 1 ) ,      t = 1 , 2 , ⋯ P(X_t|X_0,X_1,\cdots,X_{t-1})=P(X_t|X_{t-1}),\,\,\,\,t=1,2,\cdots P(XtX0,X1,,Xt1)=P(XtXt1),t=1,2,
直观解释是:未来只依赖于现在,而与过去无关
若转移概率分布 P ( X t ∣ X t − 1 ) P(X_t|X_{t-1}) P(XtXt1) t t t无关,即
P ( X t + s ∣ X t + s − 1 ) = P ( X t ∣ X t − 1 ) , t = 1 , 2 , ⋯   ; s = 1 , 2 , ⋯ P(X_{t+s}|X_{t+s-1})=P(X_t|X_{t-1}), t=1,2,\cdots;s=1,2,\cdots P(Xt+sXt+s1)=P(XtXt1),t=1,2,;s=1,2,
则称该马尔可夫链为时间齐次的马尔可夫链。

马尔可夫链的分布

马尔可夫链的状态分布由初始分布和转移概率分布决定。
π ( t ) = P t π ( 0 ) \pi(t)=P^t\pi(0) π(t)=Ptπ(0)
其中, P t P^t Pt称为 t t t步转移概率矩阵。

平稳分布

对于马尔可夫链,若存在一个状态空间 S S S上的一个分布, π = [ π 1 , π 2 , ⋯   ] \pi=[\pi_1,\pi_2,\cdots] π=[π1,π2,],使得 π = P π \pi=P\pi π=Pπ,则称 π \pi π为马尔可夫链的平稳分布。
马尔可夫链可能存在唯一平稳分布,无穷多个平稳分布,或不存在平稳分布。

连续状态的马尔可夫链

S S S是连续状态空间,对任意的 x ∈ S , a ⊂ S x\in S,a\subset S xS,aS,转移核 P ( x , A ) P(x,A) P(x,A)定义为
P ( x , A ) = ∫ A p ( x , y ) d y P(x,A)=\int_Ap(x,y)dy P(x,A)=Ap(x,y)dy
其中 p ( x , ⋅ ) p(x,\cdot) p(x,)是概率密度函数,满足 p ( x , ⋅ ) ⩾ 0 p(x,\cdot)\geqslant0 p(x,)0 P ( x , S ) = ∫ S p ( x , y ) d y = 1 P(x,S)=\int_Sp(x,y)dy=1 P(x,S)=Sp(x,y)dy=1,转移核 P ( x , A ) P(x,A) P(x,A)表示从 x ∼ A x\sim A xA的转移概率
P ( X t = A ∣ X t − 1 = x ) = P ( x , A ) P(X_t=A|X_{t-1}=x)=P(x,A) P(Xt=AXt1=x)=P(x,A)
如果马尔可夫链的状态空间 S S S上的概率分布 π ( x ) \pi(x) π(x)满足条件
π ( y ) = ∫ p ( x , y ) π ( x ) d x , ∀ y ∈ S \pi(y)=\int p(x,y)\pi(x)dx,\forall y\in S π(y)=p(x,y)π(x)dx,yS
则称分布 π ( x ) \pi(x) π(x)为该马尔可夫链的平稳分布。

马尔可夫链的性质

1、不可约

设有马尔可夫链 X X X,状态空间为 S S S,对于任意状态 i , j ∈ S i,j\in S i,jS,如果存在一个时刻 t ( t > 0 ) t(t>0) t(t>0),满足
P ( X t = i ∣ X 0 = j ) > 0 P(X_t=i|X_0=j)>0 P(Xt=iX0=j)>0
也就是说,时刻0从状态 j j j出发,时刻 t t t到达状态 i i i的概率大于0,则称此马尔可夫链X是不可约的。

2、非周期

设马尔可夫链 X X X,状态空间为 S S S,对于任意状态 i ∈ S i\in S iS,如果时刻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,则称次马尔可夫链 X X X是非周期的,否找称马尔可夫链是周期的。
直观上,一个非周期性的马尔可夫链,不存在一个状态,从这个状态出发,再返回到这个状态是所经历的时间长呈现一定的周期性。

定理1:不可约且非周期性的有限状态马尔可夫链,有唯一平稳分布存在。
注意,此时定理只对于有限状态的马尔可夫链成立。

3、正常返

设有马尔可夫链 X X X,状态空间为 S S S,对于任意状态 i , j ∈ S i,j\in S i,jS,定义概率 p i j t p_{ij}^t pijt为时刻0从状态 j j j出发,时刻 t t t首次转移到状态 i i i的概率,即 p i j t = P ( X t = i , X s ≠ i , s = 1 , 2 , ⋯   , t − 1 ∣ X 0 = j ) , t = 1 , 2 , ⋯ p_{ij}^t=P(X_t=i,X_s\not=i,s=1,2,\cdots,t-1|X_0=j),t=1,2,\cdots pijt=P(Xt=i,Xs=i,s=1,2,,t1X0=j),t=1,2,,若对所有状态 i , j i,j i,j都满足 lim ⁡ t → ∞ p i j t > 0 \lim_{t\rightarrow\infty}p_{ij}^t>0 limtpijt>0,则称马尔可夫链 X X X是正常返的。
直观上,一个正常返的马尔可夫链,其中任意一个状态,从其他任意一个状态出发,当时间趋于无穷时,首次转移到这个状态的概率不为0.
定理2:不可约、非周期且正常返的马尔可夫链,有唯一平稳分布存在。
此时对于连续状态空间的马尔可夫链也成立。

4、遍历定理

设马尔可夫链 X X X,状态空间为 S S S,若次马尔可夫链为不可约、非周期且正常返的,则此马尔可夫链有位移的平稳分布 π = ( π 1 , π 2 , ⋯   ) T \pi=(\pi_1,\pi_2,\cdots)^T π=(π1,π2,)T,并且转移概率的极限分布是马尔可夫链的平稳分布
lim ⁡ t → ∞ P ( X t = i ∣ X 0 = j ) = π i ,      i = 1 , 2 , ⋯   ; j = 1 , 2 , ⋯ \lim_{t\rightarrow\infty}P(X_t=i|X_0=j)=\pi_i,\,\,\,\,i=1,2,\cdots;j=1,2,\cdots tlimP(Xt=iX0=j)=πi,i=1,2,;j=1,2,
直观解释:蛮子相应条件的马尔可夫链,当时间区域正无穷时,马尔可夫链的状态分布趋近于平稳分布,随机变量的函数的样本均值以概率1收敛于该函数的数学期望。

5、可逆马尔可夫链

设有马尔可夫链 X X X,状态空间为 S S S,转移概率矩阵为 P P P,如果有状态分布 π = ( π 1 , π 2 , ⋯   ) T \pi=(\pi_1,\pi_2,\cdots)^T π=(π1,π2,)T,对于任意状态 i , j ∈ S i,j\in S i,jS,对任意一个时刻 t t t满足
P ( X t = i ∣ X t − 1 = j ) π j = P ( X t = j ∣ X t − 1 = i ) π i ,     i , j = 1 , 2 , ⋅ P(X_t=i|X_{t-1}=j)\pi_j=P(X_t=j|X_{t-1}=i)\pi_i,\,\,\,i,j=1,2,\cdot P(Xt=iXt1=j)πj=P(Xt=jXt1=i)πi,i,j=1,2,
或简写为
p j i π j = p i j π i ,      i , j = 1 , 2 , ⋯ p_{ji}\pi_j=p_{ij}\pi_i,\,\,\,\,i,j=1,2,\cdots pjiπj=pijπi,i,j=1,2,
则称此马尔可夫链 X X X可逆马尔可夫链。上述式子为细致平衡方程(detailed-balance equation)
满足细致平衡方程的状态分布 π \pi π就是该马尔可夫链的平稳分布,即
P π = π P\pi=\pi Pπ=π
可逆马尔可夫链一定有唯一平稳分布,此为充分条件。
证明:
P ( π ) i = ∑ j p i j π j = ∑ j p j i π i = π i ∑ j p j i = π i P(\pi)_i=\sum_jp_{ij}\pi_j=\sum_jp_{ji}\pi_i=\pi_i\sum_jp_{ji}=\pi_i P(π)i=jpijπj=jpjiπi=πijpji=πi

马尔可夫链蒙特卡洛法(MCMC)

适用于随机变量时多元的、密度函数是非标准形式的、随机变量各分量不独立等情况。
假设多元随机变量,其概率密度为 p ( x ) p(x) p(x) f ( x ) f(x) f(x)是定义在 x x x上的函数。目标是获取符合概率分布 p ( x ) p(x) p(x)的分布,并求解函数 f ( x ) f(x) f(x)的数学期望 E p ( x ) [ f ( x ) ] E_{p(x)}[f(x)] Ep(x)[f(x)]
基本思想:在随机变量 x x x的状态空间 S S S上定义一个满足变量定理的马尔可夫链,使其平稳分布就是抽样的目标分布 p ( x ) p(x) p(x)

Metropolis-Hastings算法

假设要抽样的概率分布为 p ( x ) p(x) p(x),M-H方法采用转移核为 p ( x , x ′ ) p(x,x^{'}) p(x,x)的马尔可夫链:
p ( x , x ′ ) = q ( x , x ′ ) α ( x , x ′ ) p(x,x^{'})=q(x,x^{'})\alpha(x,x^{'}) p(x,x)=q(x,x)α(x,x)
其中 q ( x , x ′ ) q(x,x^{'}) q(x,x) α ( x , x ′ ) \alpha(x,x^{'}) α(x,x)分别称为建议分布和接受分布。建议分布 q ( x , x ′ ) q(x,x^{'}) q(x,x)是另外一个马尔可夫链的转移核,并且 q ( x , x ′ ) q(x,x^{'}) q(x,x)是不可约的,其概率值恒不为0,同时是一个容易抽样的分布。接受分布 α ( x , x ′ ) \alpha(x,x^{'}) α(x,x)
α ( x , x ′ ) = min ⁡ { 1 , p ( x ′ ) q ( x ′ , x ) p ( x ) q ( x , x ′ ) } \alpha(x,x^{'})=\min\{1,\frac{p(x^{'})q(x^{'},x)}{p(x)q(x,x^{'})}\} α(x,x)=min{ 1,p(x)q(x,x)p(x)q(x,x)}
可以证明,转移核为 p ( x , x ′ ) p(x,x^{'}) p(x,x)的马尔可夫链是可逆马尔可夫链(满足遍历定理),其平稳分布就是 p ( x ) p(x) p(x),即要抽样的目标分布。
展示代码:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['FangSong']
plt.rcParams['axes.unicode_minus'] = False


class MCMC:
    def __init__(self, m, n):
        self.m = m
        self.n = n
        self.x = 2.5
        self.samples = []

    def p(self, x):  # 假设f1为我们想要进行抽样的分布
        return 0.3/np.sqrt(np.pi*2)*np.exp(-(x+2)**2/2) + 0.7/np.sqrt(np.pi*2)*np.exp(-(x-4)**2/2)

    def q(self, m, x):
        return 1/np.sqrt(2*np.pi)*np.exp(-(x-m)**2/2)

    def plot(self):
        x = np.arange(-10, 10, 0.01)
        plt.plot(x, self.p(x), linewidth=3)

    def sampling(self):
        for i in range(self.m):
            x = np.random.normal(self.x, 1)
            t = min(1, self.p(x)*self.q(x, self.x)/(self.p(self.x)*self.q(self.x, x)))
            u = np.random.random()
            if u < t:
                self.x = x
        for i in range(self.n):
            x = np.random.normal(self.x, 1)
            t = min(1, self.p(x) * self.q(x, self.x) / (self.p(self.x) * self.q(self.x, x)))
            u = np.random.random()
            if u < t:
                self.x = x
            self.samples.append(self.x)

    def test(self):
        plt.hist(self.samples, bins=200, normed=True)
        plt.show()


M = MCMC(10000, 500000)
M.sampling()
M.plot()
M.test()

运行结果为:
马尔可夫链蒙特卡洛法(MCMC)的原理讲解以及Metropolis-Hasting与Jibbs算法python实现_第1张图片
可以看到,抽样的结果已经近似于标准的分布。

Jibbs算法

Jibbs采样用于多元变量联合分布的抽样估计。基本做法是,从联合概率分布定义满条件概率分布,依次对满条件概率分布进行抽样,得到样本的序列。可以证明这样的抽样过程是在一个马尔可夫链上游走,每一个样本对应着马尔可夫链的状态,平稳分布就是目标的联合分布。
假设多元变量的联合分布为 p ( x ) = p ( x 1 , x 2 , ⋯   , x k ) p(x)=p(x_1,x_2,\cdots,x_k) p(x)=p(x1,x2,,xk)。吉布斯抽样从一个初始样本 x ( 0 ) = ( x 1 ( 0 ) , x 2 ( 0 ) , ⋯   , x k ( 0 ) ) T x^{(0)}=(x^{(0)}_1,x^{(0)}_2,\cdots,x^{(0)}_k)^T x(0)=(x1(0),x2(0),,xk(0))T出发,不断进行迭代,每一次迭代得到联合分布的一个样本 x ( i ) = ( x 1 ( i ) , x 2 ( i ) , ⋯   , x k ( i ) ) T x^{(i)}=(x^{(i)}_1,x^{(i)}_2,\cdots,x^{(i)}_k)^T x(i)=(x1(i),x2(i),,xk(i))T。最终得到样本序列 { x ( 0 ) , x ( 1 ) , ⋯   , x ( n ) } \{x^{(0)},x^{(1)},\cdots,x^{(n)}\} { x(0),x(1),,x(n)}
在每次迭代中,依次对k个随机变量中的一个变量进行随机抽样。如果在第 i i i次迭代中,对第 j j j个变量进行随机抽样,那么抽样的分布是满条件概率分布 p ( x j ∣ x − j ( i ) ) p(x_j|x^{(i)}_{-j}) p(xjxj(i)),这里 x − j ( i ) x^{(i)}_{-j} xj(i)表示第 i i i次迭代中,变量 j j j以外的其他变量。
Jibbs抽样就是单分量Metropolis-Hesting 算法的特殊情况,定义建议分布当前变量 x j , j = 1 , 2 , ⋯   , k x_j,j=1,2,\cdots,k xj,j=1,2,,k的满条件概率分布
q ( x , x ′ ) = p ( x j ′ ∣ x − j ) q(x,x^{'})=p(x_j^{'}|x_{-j}) q(x,x)=p(xjxj)
用到 p ( x − j ) = p ( x − j ′ ) p(x_{-j})=p(x_{-j}^{'}) p(xj)=p(xj) p ( ⋅ ∣ x − j ) = p ( ⋅ ∣ x − j ′ ) p(\cdot|x_{-j})=p(\cdot|x^{'}_{-j}) p(xj)=p(xj),可以证明接受概率 α = 1 \alpha=1 α=1
代码如下:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['FangSong']
plt.rcParams['axes.unicode_minus'] = False


class Jibbs:
    def __init__(self, m, n):
        self.x = [0, 0]
        self.samples = []
        self.mean = [0, 0]
        self.p = 0.5
        self.cov = [[1, self.p], [self.p, 1]]
        self.m = m
        self.n = n

    def sampling(self):
        for i in range(self.m):
            x = np.random.normal(self.p * self.x[1], 1 - self.p ** 2)
            self.x[0] = x
            x = np.random.normal(self.p * self.x[0], 1 - self.p ** 2)
            self.x[1] = x
        for i in range(self.n):
            x = np.random.normal(self.p * self.x[1], 1 - self.p ** 2)
            self.x[0] = x
            self.samples.append(self.x.copy())
            x = np.random.normal(self.p * self.x[0], 1 - self.p ** 2)
            self.x[1] = x
            self.samples.append(self.x.copy())
        self.samples = np.array(self.samples)

    def process(self):  # 展示抽样过程
        plt.pause(1)
        for i in range(self.samples.shape[0]):
            plt.plot(self.samples[:i, 0], self.samples[:i, 1], color='blue')
            plt.pause(0.01)
        plt.pause(3)

    def contrast(self):  # 与标准进行对比
        p1 = plt.subplot(1, 2, 1)
        p1.set_title('抽样结果')
        plt.axis([-5, 5, -5, 5])
        plt.scatter(self.samples[:, 0], self.samples[:, 1])
        p2 = plt.subplot(1, 2, 2)
        p2.set_title('标准')
        plt.axis([-5, 5, -5, 5])
        X = np.random.multivariate_normal(self.mean, self.cov, self.samples.shape[0])
        plt.scatter(X[:, 0], X[:, 1])
        plt.show()


J = Jibbs(100, 150)
J.sampling()
J.process()

运行的结果为:

展示的是采用Gibbs采样的过程。
最终的采样结果为:
马尔可夫链蒙特卡洛法(MCMC)的原理讲解以及Metropolis-Hasting与Jibbs算法python实现_第2张图片
可见,抽样的结果已经与标准相差无几。

你可能感兴趣的:(马尔可夫链蒙特卡洛法(MCMC)的原理讲解以及Metropolis-Hasting与Jibbs算法python实现)