本篇文章讲讲Monte Carlo方法在数值计算上的应用,这一问题是MCMC(Markov Chain Monte Carlo)采样的子问题。
假定需求积分为I=∫ θ P(θ)dθ ,其中P(θ) 的积分式很难求得,比如P(θ)=sinθθ 。
其问题可以转化为求一个随机变量的函数的期望的问题。设θ∼Q(θ) ,θ 服从概率密度函数为Q(θ) 的分布。将P(θ)Q(θ) 看作是关于随机变量θ 的函数,上述积分可转化为I=∫ θ P(θ)Q(θ) ⋅Q(θ)dθ=E[P(θ)Q(θ) ] 关于随机变量θ 的函数P(θ)Q(θ) 的数学期望。
Monte Carlo方法的核心是对于随机变量θ 大规模采样,可以依E ˆ [P(θ)Q(θ) ]=1n ∑ n i=1 P(θ i )Q(θ i ) 得到期望的估计值E ˆ .
依大数定律:
当采样的规模足够大时,有:
需要注意的是若积分限为[a,b]则所选取的θ∼Q(θ) 中的概率密度函数的定义域也是[a,b]。
举个例子,还是以P(θ)=sinθθ 为例,设所求积分为I 1 =∫ 1 0 sinθθ dθ ,设θ∼U(0,1) 服从[0,1]上的均匀分布,概率密度函数为f(θ)=1,(0⩽θ⩽1) 。
积分I 1 的近似估计值为:
Python代码:
#coding:utf-8
import numpy as np
import random
n = 10000 #采样数
def func(x):
x = random.uniform(0, 1)
return np.sin(x)/x
print sum(map(func, range(n)))/n
#输出为0.945611582984
计算sinθ 在[0,1]内积分,符号结果为cos0−cos1=1−cos1
#将上述函数改为np.sin(x) 后输出为0.460831340906
>>> import numpy as np
>>> 1 - np.cos(1)
0.45969769413186035
可见采样数为10000时结果相差不大。