天天看点

拒绝采样(reject sampling)原理详解

文章转自:https://blog.csdn.net/jteng/article/details/54344766

版权归原作者!

  蒙特·卡罗方法(Monte Carlo method)也称统计模拟方法,通过重复随机采样模拟对象的概率与统计的问题,在物理、化学、经济学和信息技术领域均具有广泛应用。拒绝采样(reject sampling)就是针对复杂问题的一种随机采样方法。

  首先举一个简单的例子介绍Monte Carlo方法的思想。假设要估计圆周率π

的值,选取一个边长为1的正方形,在正方形内作一个内切圆,那么我们可以计算得出,圆的面积与正方形面积之比为π/4

。现在在正方形内随机生成大量的点,如图1所示,落在圆形区域内的点标记为红色,在圆形区域之外的点标记为蓝色,那么圆形区域内的点的个数与所有点的个数之比,可以认为近似等于π/4

。因此,Monte Carlo方法是通过随机采样的方式,以频率估计概率。

拒绝采样(reject sampling)原理详解
拒绝采样(reject sampling)原理详解
拒绝采样(reject sampling)原理详解
import numpy as np
import matplotlib.pyplot as plt

size = 
z = np.random.normal(loc = ,scale = , size = size)
sigma = 
qz = /(np.sqrt(*np.pi)*sigma**)*np.exp(-*(z-)**/sigma**)
k = 
u = np.random.uniform(low = , high = k*qz, size = size)

pz =  *np.exp(-(z-)**) + * np.exp(-(z-)**/)
sample = z[pz >= u]
plt.hist(sample,bins=,normed = True)
           
拒绝采样(reject sampling)原理详解
import numpy as np
import matplotlib.pyplot as plt

def f1(x):
    return *np.exp(-(x-)**) + * np.exp(-(x-)**/)
def f2(x):
    sigma =
    return /(np.sqrt(*np.pi)*sigma**)*np.exp(-*(x-)**/sigma**)
x = np.arange(-,,)

plt.plot(x,f1(x),color = "red")
plt.plot(x,f2(x),color = "blue")
plt.xticks([])
plt.yticks([])
plt.ylim(,)
plt.xlim(-,)
plt.plot([,],[,],color = "black")
plt.plot(,,'b.')
plt.fill_between(x,f1(x),f2(x),color = (,,))
plt.annotate('$z_0$',xy=(,),xytext=(,-),fontsize=)
plt.annotate('$u_0$',xy=(,),xytext=(,),fontsize=)
plt.annotate('$kq(z_0)$',xy=(,),xytext=(-,),fontsize=)
plt.annotate('$p(z)$',xy=(,),xytext=(,),fontsize=)
plt.annotate('$kq(z)$',xy=(,),xytext=(,),fontsize=)
           

另外,参考:https://zhuanlan.zhihu.com/p/34071776