文章转自:https://blog.csdn.net/jteng/article/details/54344766
版权归原作者!
蒙特·卡罗方法(Monte Carlo method)也称统计模拟方法,通过重复随机采样模拟对象的概率与统计的问题,在物理、化学、经济学和信息技术领域均具有广泛应用。拒绝采样(reject sampling)就是针对复杂问题的一种随机采样方法。
首先举一个简单的例子介绍Monte Carlo方法的思想。假设要估计圆周率π
的值,选取一个边长为1的正方形,在正方形内作一个内切圆,那么我们可以计算得出,圆的面积与正方形面积之比为π/4
。现在在正方形内随机生成大量的点,如图1所示,落在圆形区域内的点标记为红色,在圆形区域之外的点标记为蓝色,那么圆形区域内的点的个数与所有点的个数之比,可以认为近似等于π/4
。因此,Monte Carlo方法是通过随机采样的方式,以频率估计概率。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXuVzVaZTOxoVds1WWwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DMyEDMwEzMxITOxgDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
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)
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