根据概率分布随机采样python_接受拒绝采样(Acceptance-Rejection Sampling)

1.Acceptance-Rejection Sampling过程

  1. 需求: 由已知分布的概率密度函数
    ,产生服从此分布的
    样本
  2. 准备工作:
  • 需要一个辅助的“建议分布”
    (概率密度函数
    已知)来产生
    候选样本。可选均匀分布、正态分布等。
  • 还需要另一个辅助的均匀分布
  • 计算一个常数值
    。——满足不等式
    的最小值
    (当然,我们非常希望
    接近于1)

3. 开始样本生成:

  • 从建议分布
    抽样,得到样本
  • 从分布
    抽样,得到样本
  • 如果
    ,则令
    (接受
    ),否则继续执行步骤1(拒绝)。

2.Acceptance-Rejection Sampling的直观解释

假设使用

来作为“proposal distribution”
,这样
。如下图所示,我们每次生成的两个样本
,对应下图中矩形内的一点
。接受条件
,即
的几何意义是点
下方,不接受
的几何意义是点
的上方。在
下方的点(o形状)满足接受条件,上方的点(+形状)不满足接受条件。

根据概率分布随机采样python_接受拒绝采样(Acceptance-Rejection Sampling)_第1张图片

3.Acceptance-Rejection Sampling有效性证明(待)

证明前,先给出几个非常重要的性质:

  1. 是随机变量,因此在第三步中
    是独立的。
  2. 从proposal分布和均匀分布中成功一次获得
    的抽样(迭代)次数
    也是个随机变量,服从概率是
    的几何分布:
    ,因此成功一次获得
    的平均抽样(迭代)次数是
  3. 最后我们获得
    给定下的条件分布,即
    成立

我们可以直接计算出

,因为

求积分得:

因此

,从而得到我们选择一个
函数从而使
最小的合理性。

下面证明接受拒绝采样的有效性:

我们需要证明的是:

。我们定义:
,
。从上面我们知道:
,然后我们使用贝叶斯:
可以得到:

其中:

4.python实现

假如我们的目标概率密度函数是

,对此分布生成样本。
  1. 准备工作:
  • 建议分布函数
    选择
    ,概率密度函数为
    。(这里我们简单化了,一般要使得c最小的g函数);
  • 辅助的均匀分布
    ;
  • 计算常数值,
    ,(

2. 生成代码如下:

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(split_val):
    global c
    global power
    while True:
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        if y*c <= math.pow(x - split_val, 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='c*f(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(t))
plt.hist(samples, bins=50, normed=True,label='sampling')
plt.legend()
plt.show()

根据概率分布随机采样python_接受拒绝采样(Acceptance-Rejection Sampling)_第2张图片

5.小结

使用接受-拒绝采样,我们可以解决一些概率分布不是常见的分布的时候,得到其采样集并用蒙特卡罗方法求和得到。但是接受-拒绝采样也只能部分满足我们的需求,在很多时候我们还是很难得到我们的概率分布的样本集。比如之前的第一个问题有时可以解决,但又会产生另一个问题:

  1. 对于一些二维分布
    ,我们只能得到条件分布
    ,却不能得到二维分布的一般形式;
  2. 对于复杂非常见分布
    ,我们很难找到合适的

要想将蒙特卡罗方法作为一个通用的采样模拟求和的方法,还的需马尔科夫链的帮忙。

侵删

你可能感兴趣的:(根据概率分布随机采样python_接受拒绝采样(Acceptance-Rejection Sampling))