蒙特卡洛方法

蒙特卡罗原来是一个赌场的名称,用它作为名字大概是因为蒙特卡罗方法是一种随机模拟的方法,这很像赌博场里面的扔骰子的过程。最早的蒙特卡罗方法都是为了求解一些不太好求解的求和或者积分问题。比如积分:概率论 - 图1
如果我们很难求解出f(x)的原函数,那么这个积分比较难求解。当然我们可以通过蒙特卡罗方法来模拟求解近似值。如何模拟呢?假设我们函数图像如下图:

概率论 - 图2
则一个简单的近似求解方法是在概率论 - 图3之间随机的采样一个点。比如概率论 - 图4,然后用概率论 - 图5代表在概率论 - 图6区间上所有的概率论 - 图7的值。那么上面的定积分的近似求解为:概率论 - 图8
当然,用一个值代表概率论 - 图9区间上所有的概率论 - 图10的值,这个假设太粗糙。那么我们可以采样概率论 - 图11区间的概率论 - 图12个值:概率论 - 图13,用它们的均值来代表概率论 - 图14区间上所有的概率论 - 图15的值。这样我们上面的定积分的近似求解为:概率论 - 图16
虽然上面的方法可以一定程度上求解出近似的解,但是它隐含了一个假定,即x在[a,b]之间是均匀分布的,而绝大部分情况,概率论 - 图17概率论 - 图18之间不是均匀分布的。如果我们用上面的方法,则模拟求出的结果很可能和真实值相差甚远。
怎么解决这个问题呢? 如果我们可以得到概率论 - 图19概率论 - 图20的概率分布函数概率论 - 图21,那么我们的定积分求和可以这样进行:概率论 - 图22
上式最右边的这个形式就是蒙特卡罗方法的一般形式。当然这里是连续函数形式的蒙特卡罗方法,但是在离散时一样成立。
可以看出,最上面我们假设概率论 - 图23概率论 - 图24之间是均匀分布的时候,概率论 - 图25,带入我们有概率分布的蒙特卡罗积分的上式,可以得到:概率论 - 图26
也就是说,我们最上面的均匀分布也可以作为一般概率分布函数概率论 - 图27在均匀分布时候的特例。那么我们现在的问题转到了如何求出概率论 - 图28的分布概率论 - 图29的若干和样本上来。

马尔科夫链

马尔科夫链定义本身比较简单,它假设某一时刻状态转移的概率只依赖于它的前一个状态。
如果用精确的数学定义来描述,则假设我们的序列状态是概率论 - 图30,那么我们在时刻概率论 - 图31的状态的条件概率仅仅依赖于时刻概率论 - 图32,即:概率论 - 图33
既然某一时刻状态转移的概率只依赖于它的前一个状态,那么我们只要能求出系统中任意两个状态之间的转换概率,这个马尔科夫链的模型就定了。
概率论 - 图34
这个马尔科夫链是表示股市模型的,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。每一个状态都以一定的概率转化到下一个状态。比如,牛市以0.025的概率转化到横盘的状态。这个状态概率转化图可以以矩阵的形式表示。如果我们定义矩阵阵概率论 - 图35某一位置概率论 - 图36的值为概率论 - 图37,即从状态概率论 - 图38转化到状态概率论 - 图39的概率,并定义牛市为状态0, 熊市为状态1, 横盘为状态2. 这样我们得到了马尔科夫链模型的状态转移矩阵为:
概率论 - 图40

马尔科夫链模型状态转移矩阵的性质

  1. transfer_matrix = np.array([[0.6,0.2,0.2],[0.3,0.4,0.3],[0,0.3,0.7]],dtype='float32')
  2. start_matrix = np.array([[0.5,0.3,0.2]],dtype='float32')
  3. value1 = []
  4. value2 = []
  5. value3 = []
  6. for i in range(30):
  7. start_matrix = np.dot(start_matrix,transfer_matrix)
  8. value1.append(start_matrix[0][0])
  9. value2.append(start_matrix[0][1])
  10. value3.append(start_matrix[0][2])
  11. print(start_matrix)
  12. #进行可视化
  13. x = np.arange(30)
  14. plt.plot(x,value1,label='cheerful')
  15. plt.plot(x,value2,label='so-so')
  16. plt.plot(x,value3,label='sad')
  17. plt.legend()
  18. plt.show()

概率论 - 图41
可以发现,从10轮左右开始,我们的状态概率分布就不变了,一直保持在[0.23076934,0.30769244,0.4615386]。
如果一个非周期的马尔科夫链有状态转移矩阵概率论 - 图42, 并且它的任何两个状态是连通的,那么概率论 - 图43概率论 - 图44无关,我们有:

  1. 概率论 - 图45
  2. 概率论 - 图46
  3. 概率论 - 图47
  4. 概率论 - 图48是方程概率论 - 图49的唯一非负解,其中概率论 - 图50

上面的性质中需要解释的有:

  1. 非周期的马尔科夫链:这个主要是指马尔科夫链的状态转化不是循环的,如果是循环的则永远不会收敛。幸运的是我们遇到的马尔科夫链一般都是非周期性的。用数学方式表述则是:对于任意某一状态概率论 - 图51概率论 - 图52为集合概率论 - 图53的最大公约数,如果概率论 - 图54,则该状态为非周期的。
  2. 任何两个状态是连通的:这个指的是从任意一个状态可以通过有限步到达其他的任意一个状态,不会出现条件概率一直为0导致不可达的情况,即 概率论 - 图55 中任意一个元素都大于零。
  3. 马尔科夫链的状态数可以是有限的,也可以是无限的。因此可以用于连续概率分布和离散概率分布。
  4. 我们用 概率论 - 图56 表示在马氏链上跳转第 概率论 - 图57 步后所处的状态,如果 概率论 - 图58 存在,很容易证明以上定理的第三个结论。由于概率论 - 图59两边取极限就可以得到:概率论 - 图60
  5. 由马氏链收敛的定理, 概率分布 概率论 - 图61 将收敛到平稳分布 概率论 - 图62 。假设到第 概率论 - 图63 步的时候马氏链收敛,则有 概率论 - 图64 ,所以 概率论 - 图65 都是同分布的随机变量,当然他们并不独立。如果我们从一个具体的初始状态 概率论 - 图66 开始, 沿着马氏链按照概率转移矩阵做跳转,那么我们得到一个转移序列 概率论 - 图67 ,由于马氏链的收敛行为, 概率论 - 图68 都将是平稳分布 概率论 - 图69 的样本。

    采样

    概率分布采样

    可以通过PDF求得CDF,再通过CDF的反函数来采样。例如概率论 - 图70分布
    概率密度函数(PDF):概率论 - 图71

    1. def gumbel_pdf(x, mu=0, beta=1):
    2. z = (x - mu) / beta
    3. return np.exp(-z - np.exp(-z)) / beta

    image.png
    累计密度函数(CDF):概率论 - 图73

    1. def gumbel_cdf(x, mu=0, beta=1):
    2. z = (x - mu) / beta
    3. return np.exp(-np.exp(-z))

    CDF的反函数:概率论 - 图74

    1. def inv_gumbel_cdf(y, mu=0, beta=1, eps=1e-20):
    2. return mu - beta * np.log(-np.log(y + eps))

    我们可以利用反函数法和生成服从 Gumbel 分布的随机数:

    1. def sample_gumbel(shape):
    2. p = np.random.random(shape)
    3. return inv_gumbel_cdf(p)

    接受-拒绝采样

    对于概率分布不是常见的分布,一个可行的办法是采用接受-拒绝采样来得到该分布的样本。既然概率论 - 图75太复杂在程序中没法直接采样,那么我设定一个程序可采样的分布概率论 - 图76比如高斯分布,然后按照一定的方法拒绝某些样本,以达到接近概率论 - 图77分布的目的,其中概率论 - 图78叫做 proposal distribution
    概率论 - 图79
    具体采用过程:设定一个方便采样的常用概率分布函数概率论 - 图80,以及一个常量概率论 - 图81,使得概率论 - 图82总在概率论 - 图83的下方。如上图。
    首先,采样得到概率论 - 图84的一个样本概率论 - 图85,采样方法如概率分布采样。然后,从均匀分布概率论 - 图86中采样得到一个值概率论 - 图87。如果概率论 - 图88落在了上图中的灰色区域,则拒绝这次抽样,否则接受这个样本概率论 - 图89。重复以上过程得到概率论 - 图90个接受的样本概率论 - 图91,则最后的蒙特卡罗方法求解结果为:概率论 - 图92
    整个过程中,我们通过一系列的接受拒绝决策来达到用概率论 - 图93模拟概率论 - 图94概率分布的目的。

    代码实现

    假如我们的目标概率密度函数是 概率论 - 图95 ,对此分布生成样本。
    准备工作:

  6. 简单起见,proposal distribution选择uniform(0,1)分布,概率密度函数为概率论 - 图96

  7. 计算常数值概率论 - 图97 ```python import random import math import matplotlib.pyplot as plt import seaborn as sns import numpy as np

%matplotlib inline sns.set_style(‘darkgrid’) plt.rcParams[‘figure.figsize’] = (12, 8)

def AceeptReject(): global c global power global t while True: x = random.uniform(0, 1) y = random.uniform(0, 1) if y*c <= math.pow(x - t, power): return x

power = 4 t = 0.4
sum_ = (math.pow(1-t, power + 1) - math.pow(-t, power + 1)) / (power + 1) #求积分 x = np.linspace(0, 1, 100)

常数值c

c = 0.6*4/sum_ cc = [c for xi in x] plt.plot(x, cc, ‘—‘,label=’cf(x)’)

目标概率密度函数的值f(x)

y = [math.pow(xi - t, power)/sum_ for xi in x] plt.plot(x, y,label=’f(x)’)

采样10000个点

samples = [] for i in range(10000): samples.append(AceeptReject()) plt.hist(samples, bins=50, normed=True,label=’sampling’) plt.legend() plt.show()

  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1394249/1589350542645-36cb09c2-fd99-48f6-abec-9d55da0f1d63.png#align=left&display=inline&height=344&margin=%5Bobject%20Object%5D&name=image.png&originHeight=469&originWidth=700&size=19016&status=done&style=none&width=513)
  2. <a name="Dfqfg"></a>
  3. ### 基于马尔科夫链采样
  4. > [马尔可夫链](https://www.yuque.com/scistack/recommender/byg2xh#15h5l)
  5. 如果我们得到了某个平稳分布所对应的马尔科夫链状态转移矩阵,我们就很容易采样出这个平稳分布的样本集。<br />现在我们可以开始采样了,首先,基于初始任意简单概率分布比如高斯分布![](https://cdn.nlark.com/yuque/__latex/a7e4e3dfe945c15c398ceab45f9aa7da.svg#card=math&code=%5Cpi_0%28x%29&height=20&width=40)采样得到状态值![](https://cdn.nlark.com/yuque/__latex/3e0d691f3a530e6c7e079636f20c111b.svg#card=math&code=x_0&height=14&width=16),基于条件概率分布![](https://cdn.nlark.com/yuque/__latex/0486dad8d7e19b98b083d0e56232e41e.svg#card=math&code=P%28x%7Cx_0%29&height=20&width=57)采样状态值![](https://cdn.nlark.com/yuque/__latex/aa687da0086c1ea060a8838e24611319.svg#card=math&code=x_1&height=14&width=16),一直进行下去,当状态转移进行到一定的次数时,比如到![](https://cdn.nlark.com/yuque/__latex/7b8b965ad4bca0e41ab51de7b31363a1.svg#card=math&code=n&height=12&width=10)次时,我们认为此时的采样集![](https://cdn.nlark.com/yuque/__latex/b7371c12cd235af0354343afaab6adfc.svg#card=math&code=%28x_n%2Cx_%7Bn%2B1%7D%2Cx_%7Bn%2B2%7D%2C...%29&height=20&width=144)即是符合我们的平稳分布的对应样本集,可以用来做蒙特卡罗模拟求和了。
  6. <a name="mcUJx"></a>
  7. ##### 马尔科夫链的细致平稳条件(Detailed Balance Condition)
  8. 给定一个概率平稳分布![](https://cdn.nlark.com/yuque/__latex/4f08e3dba63dc6d40b22952c7a9dac6d.svg#card=math&code=%5Cpi&height=12&width=9), 很难直接找到对应的马尔科夫链状态转移矩阵![](https://cdn.nlark.com/yuque/__latex/44c29edb103a2872f519ad0c9a0fdaaa.svg#card=math&code=P&height=16&width=12)。而只要解决这个问题,我们就可以找到一种通用的概率分布采样方法,进而用于蒙特卡罗模拟。<br />在解决从平稳分布 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589505157858-71b81ebd-2fd6-446e-9420-c9dff5b62406.svg#align=left&display=inline&height=13&margin=%5Bobject%20Object%5D&originHeight=13&originWidth=11&size=0&status=done&style=none&width=11) , 找到对应的马尔科夫链状态转移矩阵 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589505157876-0c52707f-0e78-446b-85e7-da842f446249.svg#align=left&display=inline&height=17&margin=%5Bobject%20Object%5D&originHeight=17&originWidth=14&size=0&status=done&style=none&width=14) 之前,我们还需要先看看马尔科夫链的细致平稳条件。定义如下:<br />如果非周期马尔科夫链状态转移矩阵 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589505142832-ee787658-df52-4f1e-bfd1-365c675b9329.svg#align=left&display=inline&height=17&margin=%5Bobject%20Object%5D&originHeight=17&originWidth=14&size=0&status=done&style=none&width=14) 和概率分布 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589505143260-38c8f5d8-81db-4221-a268-8341e1fbe6f0.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=36&size=0&status=done&style=none&width=36) 对所与的 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589505142843-b29148b3-1fdd-4115-ad6c-5923b9242f17.svg#align=left&display=inline&height=20&margin=%5Bobject%20Object%5D&originHeight=20&originWidth=22&size=0&status=done&style=none&width=22) 满足:<br />![](https://cdn.nlark.com/yuque/__latex/83e8c7ab5e007b5c22acb5f817b75fde.svg#card=math&code=%CF%80%28i%29P%28i%2Cj%29%3D%CF%80%28j%29P%28j%2Ci%29%2C%20for%5C%20all%5C%20i%2Cj%0A&height=20&width=252)<br />则称概率分布 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589505276177-140089b7-aae9-4ca8-8739-9aac3c21941b.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=36&size=0&status=done&style=none&width=36) 是状态转移矩阵 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589505276099-b48e5239-c0be-406a-89a5-c7dfb1fd1630.svg#align=left&display=inline&height=17&margin=%5Bobject%20Object%5D&originHeight=17&originWidth=14&size=0&status=done&style=none&width=14) 的平稳分布(Stationary Distribution)。**这是个充分非必要条件**(分布为二维时是充要条件)。证明如下:<br />因为 ![](https://cdn.nlark.com/yuque/__latex/de814f8b616545ffa64c994fb8c63656.svg#card=math&code=%5Csum_%7Bi%3D1%7D%5E%5Cinfty%20%5Cpi%28i%29P%28i%2Cj%29%3D%5Csum_%7Bi%3D1%7D%5E%5Cinfty%20%5Cpi%28j%29P%28j%2Ci%29%3D%5Cpi%28j%29%5Csum_%7B1%7D%5E%5Cinfty%20P%28j%2Ci%29%3D%5Cpi%28j%29&height=49&width=407),所以![](https://cdn.nlark.com/yuque/__latex/3445181d8abfa69b005bb2e3c46f875e.svg#card=math&code=%5Cpi%20P%3D%5Cpi&height=16&width=54)<br />即满足马尔可夫链的收敛性质。也就是说,只要我们找到了可以使概率分布![](https://cdn.nlark.com/yuque/__latex/e5cb16c20d9f01bbbfe8f299e28d1f4b.svg#card=math&code=%5Cpi%28x%29&height=20&width=32)满足细致平稳分布的矩阵![](https://cdn.nlark.com/yuque/__latex/44c29edb103a2872f519ad0c9a0fdaaa.svg#card=math&code=P&height=16&width=12)即可。这给了我们寻找从平稳分布![](https://cdn.nlark.com/yuque/__latex/4f08e3dba63dc6d40b22952c7a9dac6d.svg#card=math&code=%5Cpi&height=12&width=9), 找到对应的马尔科夫链状态转移矩阵![](https://cdn.nlark.com/yuque/__latex/44c29edb103a2872f519ad0c9a0fdaaa.svg#card=math&code=P&height=16&width=12)的新思路。<br />不过不幸的是,仅仅从细致平稳条件还是很难找到合适的矩阵![](https://cdn.nlark.com/yuque/__latex/44c29edb103a2872f519ad0c9a0fdaaa.svg#card=math&code=P&height=16&width=12)。比如我们的目标平稳分布是![](https://cdn.nlark.com/yuque/__latex/e5cb16c20d9f01bbbfe8f299e28d1f4b.svg#card=math&code=%5Cpi%28x%29&height=20&width=32),随机找一个马尔科夫链状态转移矩阵![](https://cdn.nlark.com/yuque/__latex/f09564c9ca56850d4cd6b3319e541aee.svg#card=math&code=Q&height=18&width=13),它是很难满足细致平稳条件的,即:![](https://cdn.nlark.com/yuque/__latex/802da6e527ec67d9da02a722e619e2f5.svg#card=math&code=%5Cpi%28i%29Q%28i%2Cj%29%20%5Cneq%20%5Cpi%28j%29Q%28j%2Ci%29&height=20&width=173)
  9. <a name="d4qiz"></a>
  10. #### MCMC
  11. 由于一般情况下,目标平稳分布![](https://cdn.nlark.com/yuque/__latex/e5cb16c20d9f01bbbfe8f299e28d1f4b.svg#card=math&code=%5Cpi%28x%29&height=20&width=32)和某一个马尔科夫链状态转移矩阵![](https://cdn.nlark.com/yuque/__latex/f09564c9ca56850d4cd6b3319e541aee.svg#card=math&code=Q&height=18&width=13)不满足细致平稳条件,即![](https://cdn.nlark.com/yuque/__latex/802da6e527ec67d9da02a722e619e2f5.svg#card=math&code=%5Cpi%28i%29Q%28i%2Cj%29%20%5Cneq%20%5Cpi%28j%29Q%28j%2Ci%29&height=20&width=173),我们引入一个![](https://cdn.nlark.com/yuque/__latex/5c99cffaae1f4cfffd64689c2964660e.svg#card=math&code=%5Calpha%28i%2Cj%29&height=20&width=44)使得上式取等号:<br />![](https://cdn.nlark.com/yuque/__latex/772eb4bf540d4aa68786299c4b7886b3.svg#card=math&code=%5Cpi%28i%29Q%28i%2Cj%29%5Calpha%28i%2Cj%29%20%3D%20%5Cpi%28j%29Q%28j%2Ci%29%5Calpha%28j%2Ci%29&height=20&width=262)<br />怎样才能成立呢,其实很简单,按照对称性:<br />![](https://cdn.nlark.com/yuque/__latex/bb8e7c0c71ae2dde13e597a02aa97a9c.svg#card=math&code=%5Calpha%28i%2Cj%29%3D%5Cpi%28j%29Q%28j%2Ci%29%3B%5Calpha%28j%2Ci%29%3D%5Cpi%28i%29Q%28i%2Cj%29&height=20&width=292)<br />然后我们就可以得到了分布 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589509178364-dc139a68-7cf5-43cb-9198-2724edb14516.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=36&size=0&status=done&style=none&width=36) 对让马尔科夫链状态转移矩阵 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589509178425-eb0539a0-001d-4b6c-9fdd-51a54720b2d7.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=176&size=0&status=done&style=none&width=176)<br />其中 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589509209271-8be422aa-656c-4d10-a5c2-9c0dd19dcdfc.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=49&size=0&status=done&style=none&width=49) 一般称之为接受率,取值在 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589509209480-e50290d5-2ae9-4e47-a330-f0e9f7f83dd3.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=37&size=0&status=done&style=none&width=37) 之间,可以理解为一个概率值。这很像[接受-拒绝采样](https://www.yuque.com/scistack/recommender/byg2xh#2iRL2),那里是以一个常用分布通过一定的接受-拒绝概率得到一个非常见分布, 这里是以一个常见的马尔科夫链状态转移矩阵 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589509209322-957ee01e-398a-455c-9c5a-b4c0d167b344.svg#align=left&display=inline&height=20&margin=%5Bobject%20Object%5D&originHeight=20&originWidth=15&size=0&status=done&style=none&width=15) 通过一定的接受-拒绝概率得到目标转移矩阵 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589509209393-40e4c7b9-b6cb-4068-a6de-80df003b3a2a.svg#align=left&display=inline&height=17&margin=%5Bobject%20Object%5D&originHeight=17&originWidth=14&size=0&status=done&style=none&width=14) ,两者的解决问题思路是类似的。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1394249/1589509283630-63f1705d-7e27-4d5b-9a53-6bca0d2f9f0f.png#align=left&display=inline&height=205&margin=%5Bobject%20Object%5D&name=image.png&originHeight=460&originWidth=1173&size=240401&status=done&style=none&width=522)<br />MCMC采样算法如下:
  12. 1. 输入任意给定的马尔科夫链状态转移矩阵 ![](https://cdn.nlark.com/yuque/__latex/f09564c9ca56850d4cd6b3319e541aee.svg#card=math&code=Q&height=18&width=13),目标平稳分布 ![](https://cdn.nlark.com/yuque/__latex/e5cb16c20d9f01bbbfe8f299e28d1f4b.svg#card=math&code=%5Cpi%28x%29&height=20&width=32) ,设定状态转移次数阈值 ![](https://cdn.nlark.com/yuque/__latex/8b7d5fed535e485e329547d73a395ba2.svg#card=math&code=%5Cpi_i&height=14&width=15),需要的样本数 ![](https://cdn.nlark.com/yuque/__latex/02fc6fab57d99e7a38e3a731de42063e.svg#card=math&code=%5Cpi_2&height=14&width=16) ;
  13. 1. 从任意简单概率分布得到初始状态值 ![](https://cdn.nlark.com/yuque/__latex/3e0d691f3a530e6c7e079636f20c111b.svg#card=math&code=x_0&height=14&width=16);
  14. 1. ![](https://cdn.nlark.com/yuque/__latex/d2b28809e1570f3e9f3711bbdce71e92.svg#card=math&code=for%5C%20t%3D0%5C%20to%5C%20n_1%2Bn_2%2B1&height=18&width=173)
  15. 1. 从条件概率分布 ![](https://cdn.nlark.com/yuque/__latex/6b4802e17e4fd3f6c512e1c90a8d625b.svg#card=math&code=Q%28x%7Cx_t%29&height=20&width=56) 得到样本值 ![](https://cdn.nlark.com/yuque/__latex/47093832fc0630ca3242c37c78b346fa.svg#card=math&code=x_%2A&height=14&width=16)
  16. 1. 从均匀分布中采样![](https://cdn.nlark.com/yuque/__latex/4b10749921612657500a626b361a6cde.svg#card=math&code=U%5Csim%5B0%2C1%5D&height=20&width=69)
  17. 1. 如果![](https://cdn.nlark.com/yuque/__latex/17eed7cf049ea9f02b9580976319f9fe.svg#card=math&code=u%20%3C%20%5Calpha%28x_t%2Cx_%7B%2A%7D%29%20%3D%20%5Cpi%28x_%7B%2A%7D%29Q%28x_%7B%2A%7D%2Cx_t%29&height=20&width=225), 则接受转移![](https://cdn.nlark.com/yuque/__latex/4bc07fe06c4bb48c9feebf74f76f1eb1.svg#card=math&code=x_t%20%5Cto%20x_%7B%2A%7D&height=16&width=58),即![](https://cdn.nlark.com/yuque/__latex/4797b8850d481d89662f5e9dc7afeb0a.svg#card=math&code=x_%7Bt%2B1%7D%3D%20x_%7B%2A%7D&height=14&width=70)
  18. 1. 否则不接受转移,![](https://cdn.nlark.com/yuque/__latex/be5c072598d58911f7f4ba7b3447c7ea.svg#card=math&code=t%3D%5Cmax%28t-1%2C%200%29&height=20&width=123)
  19. 样本集![](https://cdn.nlark.com/yuque/__latex/d8f73e91cdcd8476eb5354df5850e981.svg#card=math&code=%28x_%7Bn_1%7D%2C%20x_%7Bn_1%2B1%7D%2C...%2C%20x_%7Bn_1%2Bn_2-1%7D%29&height=21&width=184)即为我们需要的平稳分布对应的样本集。<br />上述过程中 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589510703883-fb598aa3-5482-4904-ba55-1f08b2835371.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=92&size=0&status=done&style=none&width=92) 说的都是离散的情形,事实上即便这两个分布是连续的,以上算法仍然是有效,于是就得到更一般的连续概率分布 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589510703891-a3634c73-7ab1-45a7-8093-404daa2b7d35.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=35&size=0&status=done&style=none&width=35) 的采样算法,而 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589510703930-bf0e8c53-9f3b-47ce-92da-be9e64533db4.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=48&size=0&status=done&style=none&width=48) 就是任意一个连续二元概率分布对应的条件分布。<br />但是这个采样算法还是比较难在实际中应用,因为在第三步中,由于 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589510728919-19e174a6-e7bf-4d1d-a4b6-46050698d042.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=71&size=0&status=done&style=none&width=71) 可能非常的小,比如0.1,导致我们大部分的采样值都被拒绝转移,采样效率很低。有可能我们采样了上百万次马尔可夫链还没有收敛,也就是上面这个 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589510728994-e2af8c69-48d5-4fc8-9e7d-b3fe6aa0a455.svg#align=left&display=inline&height=16&margin=%5Bobject%20Object%5D&originHeight=16&originWidth=20&size=0&status=done&style=none&width=20) 要非常非常的大,这让人难以接受,怎么办呢?这时就轮到我们的M-H采样出场了。
  20. <a name="gS2Bh"></a>
  21. #### M-H采样
  22. M-H采样解决了我们上一节[MCMC采样](#d4qiz)接受率过低的问题。<br />我们可以对 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589510970198-f5da0437-5a2c-4312-91fb-286fd108333b.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=290&size=0&status=done&style=none&width=290) 两边进行扩大,此时细致平稳条件也是满足的,我们将等式扩大 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589510970194-c21313c3-6ce4-447e-afc1-c51ec7055ddb.svg#align=left&display=inline&height=17&margin=%5Bobject%20Object%5D&originHeight=17&originWidth=14&size=0&status=done&style=none&width=14) 倍,使 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589510970344-a8d3c2f6-e597-4de3-b29b-4c06872620f3.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=97&size=0&status=done&style=none&width=97) (精确来说是使得两边最大的扩大为1),这样我们就提高了采样中的跳转接受率,所以我们可以取 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589510970291-41403305-5e95-4d16-8e20-b70d947a064b.svg#align=left&display=inline&height=52&margin=%5Bobject%20Object%5D&originHeight=52&originWidth=235&size=0&status=done&style=none&width=235)<br />M-H采样算法如下:
  23. 1. 输入任意给定的马尔科夫链状态转移矩阵 ![](https://cdn.nlark.com/yuque/__latex/f09564c9ca56850d4cd6b3319e541aee.svg#card=math&code=Q&height=18&width=13),目标平稳分布 ![](https://cdn.nlark.com/yuque/__latex/e5cb16c20d9f01bbbfe8f299e28d1f4b.svg#card=math&code=%5Cpi%28x%29&height=20&width=32) ,设定状态转移次数阈值 ![](https://cdn.nlark.com/yuque/__latex/8b7d5fed535e485e329547d73a395ba2.svg#card=math&code=%5Cpi_i&height=14&width=15),需要的样本数 ![](https://cdn.nlark.com/yuque/__latex/02fc6fab57d99e7a38e3a731de42063e.svg#card=math&code=%5Cpi_2&height=14&width=16) ;
  24. 1. 从任意简单概率分布得到初始状态值 ![](https://cdn.nlark.com/yuque/__latex/3e0d691f3a530e6c7e079636f20c111b.svg#card=math&code=x_0&height=14&width=16);
  25. 1. ![](https://cdn.nlark.com/yuque/__latex/d2b28809e1570f3e9f3711bbdce71e92.svg#card=math&code=for%5C%20t%3D0%5C%20to%5C%20n_1%2Bn_2%2B1&height=18&width=173)
  26. 1. 从条件概率分布 ![](https://cdn.nlark.com/yuque/__latex/6b4802e17e4fd3f6c512e1c90a8d625b.svg#card=math&code=Q%28x%7Cx_t%29&height=20&width=56) 得到样本值 ![](https://cdn.nlark.com/yuque/__latex/47093832fc0630ca3242c37c78b346fa.svg#card=math&code=x_%2A&height=14&width=16)
  27. 1. 从均匀分布中采样![](https://cdn.nlark.com/yuque/__latex/4b10749921612657500a626b361a6cde.svg#card=math&code=U%5Csim%5B0%2C1%5D&height=20&width=69)
  28. 1. 如果![](https://cdn.nlark.com/yuque/__latex/9f3440f2116d518a22f93b186de28454.svg#card=math&code=u%20%3C%20%5Calpha%28x_t%2Cx_%7B%2A%7D%29%20%3D%20%5Cpi%28x_%7B%2A%7D%29Q%28x_%7B%2A%7D%2Cx_t%29%3D%5Cmin%5Cleft%5C%7B%5Cfrac%7B%5Cpi%28j%29Q%28j%2Ci%29%7D%7B%5Cpi%28i%29Q%28i%2Cj%29%7D%2C%201%5Cright%5C%7D&height=47&width=402), 则接受转移![](https://cdn.nlark.com/yuque/__latex/4bc07fe06c4bb48c9feebf74f76f1eb1.svg#card=math&code=x_t%20%5Cto%20x_%7B%2A%7D&height=16&width=58),即![](https://cdn.nlark.com/yuque/__latex/4797b8850d481d89662f5e9dc7afeb0a.svg#card=math&code=x_%7Bt%2B1%7D%3D%20x_%7B%2A%7D&height=14&width=70)
  29. 1. 否则不接受转移,![](https://cdn.nlark.com/yuque/__latex/be5c072598d58911f7f4ba7b3447c7ea.svg#card=math&code=t%3D%5Cmax%28t-1%2C%200%29&height=20&width=123)
  30. 很多时候我们马尔科夫转移状态矩阵是对称的,因此接受率可以写成: ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589511964894-0fc1b52f-08a6-421f-a0bd-ab151aba459e.svg#align=left&display=inline&height=52&margin=%5Bobject%20Object%5D&originHeight=52&originWidth=183&size=0&status=done&style=none&width=183)
  31. <a name="3adbi"></a>
  32. ##### <br />
  33. <a name="LBBfK"></a>
  34. ##### 代码实现
  35. 假设目标平稳分布是一个均值3,标准差2的正态分布,而选择的马尔可夫链状态转移矩阵 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589512033138-216265d0-0cf8-49ff-b252-c1856baac47e.svg#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&originHeight=23&originWidth=52&size=0&status=done&style=none&width=52) 的条件转移概率是以 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589512033185-debcd7b5-2f0e-4244-889d-18cb8fff38b1.svg#align=left&display=inline&height=17&margin=%5Bobject%20Object%5D&originHeight=17&originWidth=6&size=0&status=done&style=none&width=6) 为均值,方差1的正态分布在位置 ![](https://cdn.nlark.com/yuque/0/2020/svg/1394249/1589512033230-284d54cb-30ce-4d1a-8aaa-ff5aac788575.svg#align=left&display=inline&height=20&margin=%5Bobject%20Object%5D&originHeight=20&originWidth=8&size=0&status=done&style=none&width=8) 的值。
  36. ```python
  37. import random
  38. from scipy.stats import norm
  39. import matplotlib.pyplot as plt
  40. import seaborn as sns
  41. %matplotlib inline
  42. sns.set_style('darkgrid')
  43. plt.rcParams['figure.figsize'] = (12, 8)
  44. def norm_dist_prob(theta):
  45. y = norm.pdf(theta, loc=3, scale=2)
  46. return y
  47. def norm_Q_prob(x_prev):
  48. return norm.rvs(loc=x_prev, scale=1, size=1, random_state=None)
  49. T = 5000
  50. pi = [0 for i in range(T)]
  51. t = 0
  52. while t < T-1:
  53. t = t + 1
  54. pi_star = norm_Q_prob(pi[t-1]) #状态转移进行随机抽样
  55. alpha = min(1, (norm_dist_prob(pi_star[0]) / norm_dist_prob(pi[t - 1]))) #alpha值
  56. u = random.uniform(0, 1)
  57. if u < alpha:
  58. pi[t] = pi_star[0]
  59. else:
  60. pi[t] = pi[t - 1]
  61. plt.scatter(pi, norm.pdf(pi, loc=3, scale=2),label='Target Distribution')
  62. num_bins = 100
  63. plt.hist(pi, num_bins, normed=1, facecolor='red', alpha=0.7,label='Samples Distribution')
  64. plt.legend()
  65. plt.show()

image.png
M-H的问题:

  1. 我们的数据特征非常的多,M-H采样由于接受率计算式 概率论 - 图99 的存在,在高维时需要的计算时间非常的可观,算法效率很低。同时 概率论 - 图100 一般小于1,有时候辛苦计算出来却被拒绝了。能不能做到不拒绝转移呢?
  2. 由于特征维度大,很多时候我们甚至很难求出目标的各特征维度联合分布,但是可以方便求出各个特征之间的条件概率分布。这时候我们能不能只有各维度之间条件概率分布的情况下方便的采样呢?

Gibbs采样

重新寻找合适的细致平稳条件

在M-H采样中我们通过引入接受率使细致平稳条件满足。现在我们换一个思路。
从二维的数据分布开始,假设 概率论 - 图101 是一个二维联合数据分布,观察第一个特征维度相同的两个点 概率论 - 图102概率论 - 图103 ,容易发现下面两式成立:
概率论 - 图104
概率论 - 图105
由于两式的右边相等,因此我们有:
概率论 - 图106
也就是:
概率论 - 图107
观察上式再观察细致平稳条件的公式,我们发现在 概率论 - 图108 这条直线上,如果用条件概率分布 概率论 - 图109 作为马尔科夫链的状态转移概率,则任意两个点之间的转移满足细致平稳条件!同样的道理,在 概率论 - 图110 这条直线上,如果用条件概率分布 概率论 - 图111 作为马尔科夫链的状态转移概率,则任意两个点之间的转移也满足细致平稳条件。那是因为假如有一点 概率论 - 图112 ,我们可以得到:
概率论 - 图113
基于上面的发现,我们可以这样构造分布 概率论 - 图114 的马尔可夫链对应的状态转移矩阵 概率论 - 图115 :
概率论 - 图116
概率论 - 图117
概率论 - 图118
有了上面这个状态转移矩阵,我们很容易验证平面上的任意两点 概率论 - 图119 ,满足细致平稳条件:
image.png

二维Gibbs采样

利用上一节找到的状态转移矩阵,我们就得到了二维Gibbs采样,这个采样需要两个维度之间的条件概率。算法如下:

  1. 输入平稳分布 概率论 - 图121 ,设定状态转移次数阈值 概率论 - 图122 ,需要的样本个数 概率论 - 图123 ;
  2. 随机初始化初始状态值 概率论 - 图124概率论 - 图125 ;
  3. for 概率论 - 图126 :
    • 从条件概率分布 概率论 - 图127 中采样得到样本 概率论 - 图128
    • 从条件概率分布 概率论 - 图129 中采样得到样本 概率论 - 图130

样本集: 概率论 - 图131 即为我们需要的平稳分布对应的样本集。
整个采样过程中,马氏链的转移只是轮换的沿着坐标轴 ,采样的过程为:
概率论 - 图132
image.png
马氏链收敛后,最终得到的样本就是 概率论 - 图134 的样本,而收敛之前的阶段称为 burn-in period。额外说明一下,我们看到教科书上的 Gibbs Sampling 算法大都是坐标轴轮换采样的,但是这其实是不强制要求的。最一般的情形可以是,在 概率论 - 图135 时刻,可以在 概率论 - 图136 轴和 概率论 - 图137 轴之间随机的选一个坐标轴,然后按条件概率做转移,马氏链也是一样收敛的。轮换两个坐标轴只是一种方便的形式。

多维Gibbs采样

上面的这个算法推广到多维的时候也是成立的。比如一个 概率论 - 图138 维的概率分布 概率论 - 图139 ,可以通过在 概率论 - 图140 个坐标轴上轮换采样,来得到新的样本。对于轮换到的任意一个坐标轴 概率论 - 图141 上的转移,马尔科夫链的状态转移概率为 概率论 - 图142 ,即固定 概率论 - 图143 个坐标轴,在某一个坐标轴上移动,即每次转移只允许某一个维度上变化,可以解决维数灾难问题。算法如下:

  1. 输入平稳分布 概率论 - 图144 ,设定状态转移次数阈值 概率论 - 图145 ,需要的样本个数 概率论 - 图146
  2. 随机初始化初始状态值 概率论 - 图147
  3. for 概率论 - 图148 :
    • 从条件概率分布 概率论 - 图149 中采样得到样本 概率论 - 图150
    • 从条件概率分布 概率论 - 图151 中采样得到样本 概率论 - 图152
    • ….
    • 从条件概率分布 概率论 - 图153 中采样得到样本 概率论 - 图154
    • ….
    • 从条件概率分布 概率论 - 图155 中采样得到样本 概率论 - 图156

样本集: 概率论 - 图157 即为我们需要的平稳分布对应的样本集。当然这些样本并不独立,但是我们此处要求的是采样得到的样本符合给定的概率分布,并不要求独立。
整个采样过程和Lasso回归的坐标轴下降法算法非常类似,只不过Lasso回归是固定 概率论 - 图158 个特征,对某一个特征求极值。而Gibbs采样是固定 概率论 - 图159 个特征在某一个特征采样。
同样的,轮换坐标轴不是必须的,我们可以随机选择某一个坐标轴进行状态转移,只不过常用的Gibbs采样的实现都是基于坐标轴轮换的。

**

二维Gibbs采样实例python实现

假设我们要采样的是一个二维正态分布 概率论 - 图160 ,其中:
概率论 - 图161概率论 - 图162 ;
而采样过程中的需要的状态转移条件分布为:
概率论 - 图163
概率论 - 图164

import math
from mpl_toolkits.mplot3d import Axes3D
from scipy.stats import multivariate_normal
import random
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
sns.set_style('darkgrid')
plt.rcParams['figure.figsize'] = (12, 8)

m1 = 5
m2 = -1
s1 = 1
s2 = 2
rho = 0.5

samplesource = multivariate_normal(mean=[m1, m2], cov=[[s1, s1*s2*rho],[s1*s2*rho, s2*s2]])


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 = []

y = m2

for i in range(N):
    for j in range(K):
        x = p_xgiveny(y, m1, m2, s1, s2)   #y给定得到x的采样
        y = p_ygivenx(x, m1, m2, s1, s2)   #x给定得到y的采样
        z = samplesource.pdf([x, y])
        x_res.append(x)
        y_res.append(y)
        z_res.append(z)

num_bins = 50
plt.hist(x_res, num_bins, normed=1, facecolor='green', alpha=0.5,label='x')
plt.hist(y_res, num_bins, normed=1, facecolor='red', alpha=0.5,label='y')
plt.title('Histogram')
plt.legend()
plt.show()

image.png