目录

  • 蒙特卡洛积分的基本思想
  • 一、内置函数+平均值法
  • 二、对偶变量法
  • 三、控制变量法
  • 四、重要性抽样法

蒙特卡洛积分的基本思想

考虑可积函数g(x)g(x)g(x),现要计算∫abg(x)dx\int_a^bg(x)dx∫ab​g(x)dx。若能够将g(x)g(x)g(x)拆分为两个函数的乘积,即g(x)=f(x)t(x)g(x)=f(x)t(x)g(x)=f(x)t(x),则原积分形式可表示为∫abf(x)t(x)dx\int_a^bf(x)t(x)dx∫ab​f(x)t(x)dx。记此时的x的密度函数为f(x)f(x)f(x),那么即可表示为E(t(x))=∫abf(x)t(x)dxE(t(x))=\int_a^bf(x)t(x)dxE(t(x))=∫ab​f(x)t(x)dx。不难看出,E(t(x))E(t(x))E(t(x))是很容易利用随机数进行估计的,它的值在样本量足够大的时候,可以用∑i=1nt(xi)/n\sum\limits_{i=1}^nt(x_i)/ni=1∑n​t(xi​)/n进行估计(其中,xix_ixi​是来源于密度函数为f(x)f(x)f(x)的样本)

以上思想的关键在于密度函数f(x)f(x)f(x)的寻找(因为我们只有知道了x的分布,才能产生相对应的随机数),这就需要我们对一些基本分布的密度函数有所了解(例如:指数分布、正态分布、均匀分布等)。此外,在找f(x)f(x)f(x)的时候还需注意积分区间是否一致。以∫0∞e−xsinxdx\int_0^{\infty}e^{-x}sinxdx∫0∞​e−xsinxdx为例,看到e−xe^{-x}e−x可联想到指数分布的密度函数,而且此时的积分区间也恰好是0到正无穷,故是选参数为1的指数分布作为f(x)f(x)f(x)。

以下在R语言中,以例子进行展示不同的方法计算一重积分和二重积分

一、内置函数+平均值法

例1 计算∫0∞e−xsinxdx\int_0^{\infty}e^{-x}sinxdx∫0∞​e−xsinxdx

#内置函数
f<-function(x){exp(-x)*sin(x)}
integrate(f,0,'inf')#生成1000个参数为1的指数分布随机数
r<-rexp(1000,1)
mean(sin(r))


从结果来看,两者计算结果还是十分接近的。内置函数integrate计算的积分值为0.5,而平均值法计算的积分值为0.4965115。

例2 计算∬De(x+y)2dxdy\iint_D{e^{(x+y)^2}}dxdy∬D​e(x+y)2dxdy,其中D=[0,1]×[0,1]D=[0,1]\times[0,1]D=[0,1]×[0,1]

#内置函数法
library(cubature)
double<-function(x){exp((x[1]+x[2])^2)}
adaptIntegrate(double,c(0,0),c(1,1))$integral#平均值法
n<-1000
f<-function(x,y){exp((x+y)^2)}
x<-runif(n)
y<-runif(n)
mean(f(x,y))


二重积分的蒙特卡洛法思想可由一重积分进行推广。从结果来看,该积分值约为4.8左右。

从上面两个例子不难看出,可以利用蒙特卡洛法积分法来估计E(g(X))E(g(X))E(g(X))类型的积分。既然是估计,就有优劣之分。一般地,用方差来度量两个估计方法地优良性。定义如下:

以下的三种方法都是为了减少估计量的方差而提出的。为更加客观比较,在此重复模拟1000次。

二、对偶变量法

基本思想:

例1 使用对偶变量法计算∫01e−xsinxdx\int_0^{1}e^{-x}sinxdx∫01​e−xsinxdx,并与平均值法进行比较

n<-10000
k<-1000
set.seed(123)
MC.Phi <- function(n,k,anti = TRUE) {f<-function(x){exp(-x)*sin(x)}theat_hat <- numeric(length(k))for (i in 1:k) {u <- runif(n/2)if (!anti) v <- runif(n/2) elsev <- 1 - uu <- c(u, v)theat_hat[i]<-mean(f(u))}theat_hat
}
mean(MC.Phi(n,k))  #对偶变量积分
mean(MC.Phi(n,k,anti=FALSE)) #平均值法积分
print((1-var(MC.Phi(n,k))/var(MC.Phi(n,k,anti = FALSE)))*100) #方差减少百分比


计算结果显示,使用对偶变量法计算的积分与均值法基本无差,但估计量的方差减少了61.93%

例2 使用对偶变量法计算∬De(x+y)2dxdy\iint_D{e^{(x+y)^2}}dxdy∬D​e(x+y)2dxdy,其中D=[0,1]×[0,1]D=[0,1]\times[0,1]D=[0,1]×[0,1],并与均值法进行比较

n<-10000
k<-1000
set.seed(123)
f<-function(x,y){exp((x+y)^2)}
#均值法
simple_carlo<-function(n,k){theat_hat<-numeric()for(i in 1:k){  x<-runif(n)y<-runif(n)theat_hat[i]<-mean(f(x,y))}return(theat_hat)
}
theat_simple<-simple_carlo(n,k)
mean(theat_simple)#对偶变量法
MC.phi<-function(n,k){theat_hat=numeric()for(i in 1:k){x<-runif(n/4)y<-runif(n/4)T1<-f(x,y)T2<-f(x,1-y)T3<-f(1-x,y)T4<-f(1-x,1-y)theat_hat[i]<-mean((T1+T2+T3+T4)/4)}return(theat_hat)
}
theat_MC<-MC.phi(n,k)
mean(theat_MC)
print((1-var(theat_MC)/var(theat_simple))*100)


从对二重积分的计算结果来看,对偶变量法依旧比平均值法减少方差约56.30%。

三、控制变量法

基本思想:

注意:减小的方差百分比与选择的相关函数f(x)f(x)f(x)有很大的联系

例1 计算积分∫01e−x1+x2dx\int_0^{1}\frac{e^{-x}}{1+x^2}dx∫01​1+x2e−x​dx,并与均值法比较

n<-10000
k<-1000
set.seed(123)
g<-function(x){exp(-x)/(1+x^2)}#均值法
simple_carlo<-function(n,k){theat_hat<-numeric()for(i in 1:k){x<-runif(n)theat_hat[i]<-mean(g(x))}return(theat_hat)
}
theat_simple<-simple_carlo(n,k)
mean(theat_simple)#控制变量法
control_carlo<-function(n,k){f <- function(x){exp(-.5)/(1+x^2)}theat_hat<-numeric()for(i in 1:k){x<-runif(n)B <- f(x)A <- g(x)a <- -cov(A,B) / var(B) #est of c*T1 <- g(x)theat_hat[i] <- mean(T1 + a * (f(x) - exp(-.5)*pi/4))}theat_hat
}
theat_control<-control_carlo(n,k)
mean(theat_control)
print((1-var(theat_control)/var(theat_simple))*100)


计算结果来看,控制变量法的减少方差十分明显呀,比均值法减少了近95%的方差。

例2 使用控制变量法计算积分∬De(x+y)2dxdy\iint_D{e^{(x+y)^2}}dxdy∬D​e(x+y)2dxdy,其中D=[0,1]×[0,1]D=[0,1]\times[0,1]D=[0,1]×[0,1],并与均值法作比较

#均值法与前面相同,在此不再写出
n<-10000
k<-1000
set.seed(123)
f<-function(x,y){exp((x+y)^2)}
control_carlo<-function(n,k){theat_hat<-numeric()for(i in 1:k){u<-runif(n)v<-runif(n)g<-function(u,v){exp(u+v)}r=-cov(g(u,v),f(u,v))/var(g(u,v)) #估计c*T1<-f(u,v)theat_hat[i]<-mean(T1+r*(g(u,v)-(exp(1)-1)^2))}return(theat_hat)
}
theat_control<-control_carlo(n,k)
mean(theat_control)
print((1-var(theat_control)/var(theat_simple))*100)


积分值约为4.9,使用控制变量法比均值法的方差减少约79.28%

四、重要性抽样法

基本思想

注意:减少的方差百分比依旧与选择重要性函数有关

例1 使用不同的重要性函数计算∫01e−x1+x2dx\int_0^{1}\frac{e^{-x}}{1+x^2}dx∫01​1+x2e−x​dx
考虑如下两个重要性函数:
f1(x)=e−1(1−e−1)−1f_1(x)=e^{-1}(1-e^{-1})^{-1}f1​(x)=e−1(1−e−1)−1

f2(x)=4π(1+x2)f_2(x)=\frac{4}{\pi(1+x^2)}f2​(x)=π(1+x2)4​

以下代码中,在生成随机数x时,用到了随机数的逆变换法。

n<-10000
k<-1000
set.seed(123)
g<-function(x){exp(-x)/(1+x^2)}
simple_carlo<-function(n,k){theat_hat<-numeric()for(i in 1:k){x<-runif(n)theat_hat[i]<-mean(g(x))}return(theat_hat)
}
theat_simple<-simple_carlo(n,k)
mean(theat_simple) #均值法#重要性函数f1
f1<-function(n,k){theat_hat<-numeric()for(i in 1:k){u<-runif(n)x<-log(1-u*(1-exp(-1)))  #逆变换法fg<-g(x)/(exp(-x)/(1-exp(-1)))theat_hat[i]<-mean(fg)}theat_hat
}
theat_f1<-f1(n,k)
mean(theat_f1)
print((1-var(theat_f1)/var(theat_simple))*100)#重要性函数f2
f2<-function(n,k){theat_hat<-numeric()for(i in 1:k){u<-runif(n)x<-tan(pi*u/4)  #逆变换法fg<-g(x)/(4/(1+x^2)*pi)theat_hat[i]<-mean(fg)}theat_hat
}
theat_f2<-f2(n,k)
mean(theat_f2)
print((1-var(theat_f2)/var(theat_simple))*100)


三种方法估计的积分值基本都在0.52左右,但是使用f1方法比均值法的方差减少约83.75%,而使用f2方法只减少了63.06%。由此可见,寻找一个合适的f(x)f(x)f(x)对减少估计量的方差尤为重要。

例2 使用重要抽样计算二重积分∬De(x+y)2dxdy\iint_D{e^{(x+y)^2}}dxdy∬D​e(x+y)2dxdy,其中D=[0,1]×[0,1]D=[0,1]\times[0,1]D=[0,1]×[0,1],并与均值法进行比较

#重要抽样
n<-10000
k<-1000
set.seed(123)
f<-function(x,y){exp((x+y)^2)}
r_num<-function(n){u<-runif(n)x<-log((exp(1)-1)*u+1)return(x)
}
importance_sample<-function(n,k){g<-function(x,y){exp(x+y)/(exp(1)-1)^2}theat_hat<-numeric()for(i in 1:k){x<-r_num(n)y<-r_num(n)fg<-f(x,y)/g(x,y)theat_hat[i]<-mean(fg)}return(theat_hat)
}
theat_imp<-importance_sample(n,k)
mean(theat_imp)
print((1-var(theat_imp)/var(theat_simple))*100)


从结果来看,使用重要抽样比均值法的方差减少约71.16%

以上就是本次分享的全部内容~

R语言(二) 多种蒙特卡洛法计算一二重积分相关推荐

  1. 用计算机怎么计算r角度,R语言中的数学计算

    原标题:R语言中的数学计算 前言 R是作为统计语言,生来就对数学有良好的支持,一个函数就能实现一种数学计算,所以用R语言做数学计算题特别方便.如果计算器中能嵌入R的计算函数,那么绝对是一种高科技产品. ...

  2. R语言中的数学计算(转载)

    R语言中的数学计算 关于作者: 张丹(Conan), 程序员Java,R,PHP,Javascript weibo:@Conan_Z blog: http://blog.fens.me email: ...

  3. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.4 探索所有男选手的跑步时间...

    本节书摘来自华章计算机<数据科学R语言实践:面向计算推理与问题求解的案例研究法>一书中的第2章,第2.4节,作者:[美] 德博拉·诺兰(Deborah Nolan) 邓肯·坦普·朗(Dun ...

  4. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.1 引言...

    本节书摘来自华章计算机<数据科学R语言实践:面向计算推理与问题求解的案例研究法>一书中的第2章,第2.1节,作者:[美] 德博拉·诺兰(Deborah Nolan) 邓肯·坦普·朗(Dun ...

  5. R语言使用timeROC包计算存在竞争情况下的生存资料多个标记物在相同时间下的cox及协变量分析AUC值、并可视化多个标记物在相同时间下的ROC值、多指标的ROC曲线(Time-dependent R

    R语言使用timeROC包计算存在竞争情况下的生存资料多个标记物在相同时间下的cox及协变量分析AUC值.并可视化多个标记物在相同时间下的ROC值.多指标的ROC曲线(Time-dependent R ...

  6. R语言使用timeROC包计算无竞争情况下的生存资料多个标记物在相同时间下的cox及协变量分析AUC值、并可视化多个标记物在相同时间下的ROC值、多指标的ROC曲线

    R语言使用timeROC包计算无竞争情况下的生存资料多个标记物在相同时间下的cox及协变量分析AUC值.并可视化多个标记物在相同时间下的ROC值.多指标的ROC曲线(Time-dependent RO ...

  7. R语言使用timeROC包计算无竞争情况下的生存资料多时间AUC值、R语言使用timeROC包的plotAUCcurve函数可视化多时间生存资料的不同标记物情况下对应的AUC曲线、并进行对比

    R语言使用timeROC包计算无竞争情况下的生存资料多时间AUC值.R语言使用timeROC包的plotAUCcurve函数可视化多时间生存资料的不同标记物情况下对应的AUC曲线.并进行对比 目录

  8. R语言使用timeROC包计算存在竞争风险情况下的生存资料多时间AUC值、使用cox模型、并添加协变量、可视化存在竞争风险情况下的生存资料多时间ROC曲线

    R语言使用timeROC包计算存在竞争风险情况下的生存资料多时间AUC值.使用cox模型.并添加协变量.可视化存在竞争风险情况下的生存资料多时间ROC曲线 目录

  9. R语言编写自定义函数计算R方、使用自助法Bootstrapping估计多元回归模型的R方的置信区间、可视化获得的boot对象、估计单个统计量的置信区间、分别使用分位数法和BCa法

    R语言编写自定义函数计算R方.使用自助法Bootstrapping估计多元回归模型的R方的置信区间.可视化获得的boot对象.估计单个统计量的置信区间.分别使用分位数法和BCa法(Bootstrapp ...

最新文章

  1. 《Swift编程语言教程》中文翻译及读书笔记page21
  2. java中关于try、catch、finally中的细节分析
  3. 使用四种框架分别实现百万websocket常连接的服务器--转
  4. SQL Server 2008之DMF
  5. Android Studio提示No virtual method asBitmap()Lcom/bumptech/glide/RequestBuilder
  6. 北方大学 ACM 多校训练赛 第十五场 买花
  7. 用unison来同步你的远程文件夹 - Fwolf's Blog
  8. Struts向JSP中传值
  9. 服务器装系统后没有移动硬盘盘符
  10. plsql突然无法连接数据库,原来是tnsnames.ora文件出了问题
  11. opencv图像连通区域分析
  12. 内的图标_从零开始画图标系列:线性图标设计实战演示!
  13. 用PPT直接修改主集成模板,并保存为pps格式,即可现场展示应用.
  14. Windows Hello 摄像头人脸识别解锁 DELL拆机摄像头方案
  15. COMSOL光学仿真专题案例展示
  16. uniapp分享到微信流程
  17. 拼团返利模式玩法VS最新拼团的商业模式
  18. web项目的getContextPath()
  19. linux命令中的merge(2)
  20. IP地址管理工具Netbox 安装指南

热门文章

  1. Kali安装教程及使用
  2. linux系统硬盘怎么找,linux系统查看磁盘空间
  3. Android单元测试系列(2)-Junit
  4. 用pm2在本地部署服务器node项目,利用pm2部署多个node.js项目的配置教程
  5. java计算机毕业设计基于安卓Android的婚恋相亲app
  6. Spring是一个开源框架
  7. c语言二叉树按顺序存储输出,二叉树先序输入并且先序输出
  8. Hopfield神经网络(HNN)详解
  9. Java Sort排序总结
  10. 高德地图API获取地理信息