Monte Carlo Integration 蒙特卡罗方法求积分 附简单例题+代码

摘要

蒙特卡罗积分是一种基于随机抽样的统计方法。打个比方,要想知道抛出硬币得到正面的概率,随机投1000次,得到500次左右,推测出概率应该为 1 2 \frac{1}{2} 21。差不多是这意思,比较著名的例子是W.S.戈塞特使用随机抽样来研究现在被称为“学生t”统计数据的分布。随着计算机的出现及发展,该方法也得到发展。

文章目录

  • 摘要
  • 方法概述
  • 书本例题
  • 课上例题
  • 课后习题

方法概述

  • 概述 ∫ a b g ( x ) d x \int_a^b g(x)dx abg(x)dx
    理论基础:如果X是一个随机变量,其密度函数为 f ( x ) f(x) f(x),那么随机变量 Y = g ( X ) Y=g(X) Y=g(X)的数学期望为 E [ g ( X ) ] = ∫ − ∞ ∞ g ( x ) f ( x ) d x E[g(X)]=\int_{-\infty}^{\infty} g(x)f(x)dx E[g(X)]=g(x)f(x)dx
    那么获得服从随机变量X分布的随机数,那么所求的 E [ g ( x ) ] E[g(x)] E[g(x)] 就是该样本均值的无偏估计。

  • 计算(积分上下界为0-1) θ = ∫ 0 1 g ( x ) d x \theta=\int_0^1 g(x)dx θ=01g(x)dx, 求 θ \theta θ
    这么想: ∫ 0 1 g ( x ) d x = ∫ 0 1 g ( x ) × 1 d x \int_0^1g(x)dx=\int_0^1g(x) \times 1dx 01g(x)dx=01g(x)×1dx套上面的意思,假定X服从均匀分布 U(0,1),那么 f ( x ) = 1 f(x)=1 f(x)=1, 那么生成该均匀分布的随机数,代入 g ( x ) g(x) g(x)式子中,则
    θ = g ( x ) ‾ = 1 N ∑ 0 N g ( x i ) \theta = \overline{g(x)}=\frac{1}{N}\sum_0^Ng(x_i) θ=g(x)=N10Ng(xi)

  • 计算(积分上下界为a-b) ∫ a b g ( t ) d t \int_a^bg(t)dt abg(t)dt为了让积分上下限变为0和1,做一个变量变换:
    y = t − a b − a d y = 1 b − a d t y =\frac{t-a}{b-a}\\ dy=\frac{1}{b-a}dt y=batady=ba1dt
    像不像均匀分布分布函数表达式,对应地, ∫ a b g ( t ) d t = ∫ 0 1 1 b − a × ( y × ( b − a ) + a ) d t = ( b − a ) ∫ a b g ( t ) × 1 b − a d t \int_a^bg(t)dt=\int_0^1\frac{1}{b-a}\times(y\times(b-a)+a)dt\\ =(b-a)\int_a^bg(t)\times\frac{1}{b-a}dt abg(t)dt=01ba1×(y×(ba)+a)dt=(ba)abg(t)×ba1dt
    就可以看成要求随机变量g(Y)的均值,Y服从均匀分布U(a,b),积分结果就等于该均值再乘以(b-a)。
    Monte Carlo Integration 蒙特卡罗方法求积分 附简单例题+代码_第1张图片
    具体步骤图上写得很清楚,公式也太难敲了吧,手速有限。

  • 计算(积分上下限存在无界情况咋办呢)
    举个例子,
    计算标准正态分布函数 ϕ ( x ) = ∫ − ∞ x 1 2 π e − t 2 2 d t \phi(x)=\int^x_{-\infty}\frac{1}{\sqrt{2\pi}}e^{-\frac{t^2}{2}}dt ϕ(x)=x2π 1e2t2dt
    这么想哈,求解可以分成两种情况(x>0 or x<0):

  1. x>0
    根据积分的基本性质,积分分为两部分,被积部分相同,积分上下界分别为 [ − ∞ , 0 ] ( 这 部 分 积 分 值 为 0.5 ) 和 [ 0 , x ] [-\infty, 0] (这部分积分值为0.5)和[0,x] [,0]0.5[0,x]
    再说 [ 0 , x ] [0,x] [0,x],求 θ = ∫ 0 x e − t 2 2 d t \theta=\int^x_0e^{-\frac{t^2}{2}}dt θ=0xe2t2dt,这可以利用上面提到过的方法,生成服从U[0,x]的随机数。但是,若给出的概率分布函数x都不同,我们均匀分布的参数也得一直修改。于是,偏好于用0-1均匀分布来进行采样。
    y = t x y=\frac{t}{x} y=xt, 则有 d t = x d y dt=xdy dt=xdy,且
    θ = ∫ 0 1 x e − ( x y ) 2 2 d y = E Y [ x e − ( x Y ) 2 2 ] \theta=\int^1_0xe^{-\frac{(xy)^2}{2}}dy=E_Y[xe^{-\frac{(xY)^2}{2}}] θ=01xe2(xy)2dy=EY[xe2(xY)2]
    此处,随机变量y服从0-1均匀分布。于是,生成m个0-1均匀分布随机数 y i y_i yi,计算
    θ ^ = 1 m ∑ 1 m x e − ( x y i ) 2 2 \hat\theta=\frac{1}{m}\sum_1^mxe^{-\frac{(xy_i)^2}{2}} θ^=m11mxe2(xyi)2
    当m趋于正无穷时, θ \theta θ的估计值越贴近真实值。
    ϕ ( x ) = 0.5 + θ ^ 2 π \phi(x)=0.5+\frac{\hat\theta}{\sqrt{2\pi}} ϕ(x)=0.5+2π θ^
  2. x<0
    根据正态密度函数图像的对称性, ϕ ( x ) = 1 − ϕ ( − x ) \phi(x)=1-\phi(-x) ϕ(x)=1ϕ(x)。自己琢磨。

代码:

x <- seq(.1, 2.5, length = 10)  #取十个x做做,算出十个值
m <- 10000
u <- runif(m)
cdf <- numeric(length(x))
for (i in 1:length(x)) {
g <- x[i] * exp(-(u * x[i])^2 / 2)
cdf[i] <- mean(g) / sqrt(2 * pi) + 0.5
}
#利用内置函数求精确解
Phi <- pnorm(x)
print(round(rbind(x, cdf, Phi), 3)) #对比分析一下,估计得蛮准

	[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]  [,10]
x   0.10 0.367 0.633 0.900 1.167 1.433 1.700 1.967 2.233 2.500
cdf 0.54 0.643 0.737 0.816 0.879 0.925 0.957 0.978 0.990 0.997
Phi 0.54 0.643 0.737 0.816 0.878 0.924 0.955 0.975 0.987 0.994

书本例题

  1. 对应Monte Carlo Integration 蒙特卡罗方法求积分 附简单例题+代码_第2张图片
m <- 10000
x <- runif(m)
theta.hat <- mean(exp(-x))
print(theta.hat)
print(1 - exp(-1))
[1] 0.6355289 #估计值
[1] 0.6321206  #解析解

2.Monte Carlo Integration 蒙特卡罗方法求积分 附简单例题+代码_第3张图片

m <- 10000
x <- runif(m, min=2, max=4)
theta.hat <- mean(exp(-x)) * 2
print(theta.hat)
print(exp(-2) - exp(-4))
[1] 0.1172158
[1] 0.1170196

课上例题

  1. 蒙特卡罗方法—求 π \pi π
# 自己写的
N = 5000
x = runif(N)
y = runif(N)
count = 0
for(i in 1:N){
  z = x[i]**2+y[i]**2 
  count[z<=1]=count+1
}
Pi = 4*count/N
Pi
[1] 3.1328
#老师写的,还画出来图
N = 10000
x = matrix(runif(N*2),N,2)
plot(x)
L = x[,1]^2+x[,2]^2<=1
points(x[L,], col="red")
n = sum(L)
p = 4*n/N
p

Monte Carlo Integration 蒙特卡罗方法求积分 附简单例题+代码_第4张图片
3. 蒙特卡洛方法—蒲丰投针问题

课后习题

Monte Carlo Integration 蒙特卡罗方法求积分 附简单例题+代码_第5张图片

x = runif(3000,0,pi/3)
fx = sin(x)
Fx2 = -(cos(pi/3)-cos(0))
Fx = (pi/3)*mean(fx)
> Fx2 #解析解
[1] 0.5
> Fx  #估计解
[1] 0.496512

你可能感兴趣的:(统计,概率论,统计学,r语言)