前几天在主站上看到一篇谈Monte Carlo求定积分的方法的文章。记得去年我学
时,求定积分便用到了这两种方法,而在上概率论课时,老师也略微涉及到相关的内容。当时的感觉时,定积分这种一般用确定型算法计算的东西,竟然还可以用随机的方法来实现,确是一种非常巧妙的思想,(
是摩纳哥的一个赌城,二战时
一伙人研究原子弹时弄出来的方法。)于是被震撼,也没有再深究其中更详细的内容。
但是昨天一看到这篇文章,便想起寒假时候看的那本《计算方法》中关于平均值方法的论述,而最近在上计算方法的课,正纠结与一堆无聊的误差计算中,于是便再次翻开此书看看,竟发现了一些一直没太注意的很重要的章节。
具体如下:
- 平均值方法是根据弱大数定律证明得来的。构造如此
均方误差
而由不等式知
,从中便可知法具有半阶收敛性,且收敛阶不依赖问题的维数,这样在计算高维积分的时候,比较优越。但是收敛速度还是很慢的,是一个比较坏的收敛速度。因此在有其他高效率、高精度的确定型算法时,就不要采用
法,那是在没有更好的算法时更好的抉择,比如超高维积分。
- 由均方误差可知,要提高
法的精确度,那么久必须得增大
,减小
,也就是说,要增加样本量,同时改善抽样方法的选择,这时便有很多方法选择,书中提到了四种方法,我就谈谈我的理解和试验。
- 分层抽样。核心就是将原来的
区间
等分后在各个小区间上分别再以均匀分布抽样
个点,然后以
理论证明知这样方差减少,具体证明式子较多就不再写,否则就是一本教材的翻版了。
模拟,具体实验结果如下
1 2 3 4 5 6 7
M<-100 N<-1000 A=matrix(as.numeric(gl(M,N/M))-1,ncol=N/M,byrow=T) B=replicate(M,runif(N/M)) x=1/M*t(B)+A/M y=exp(-x^2/2)/sqrt(2*pi) I=mean(y)
结果为0.3413287,可知只取了1000个样本点的情况下,精确度已经十分好了,而一般的均值模拟
达到此精确度则需要个点。
- 对偶变量法。
这是一种特殊的针对于定义域具有一定对称性的函数性质的技巧。基于这样的命题:如果是单调的,则
,这里
。则有
,
则,
经过证明知,方差显然减少。
但是这种方法只是对于定义域有一定对称性的函数,如果对一种函数先验了解不多,而且对称性不知,则运用会出现失误,所以具有一定局限性。
模拟的代码如下:
1 2 3
a=runif(10^6) y=exp(-a^2/2)/sqrt(2*pi)+exp(-(1-a)^2/2)/sqrt(2*pi) b=sum(y)/(2*10^6)
结果为 0.3413487,精确度也得到了提高。
- 重要性抽样:核心就是构造一个新的积分
其中为
的概率密度,
,
。这样得到类似于最初最简单的那种均值法的新的形式积分近似
,
为遵循p(y)的独立同分布随机变量(i.i.d),而之所以这样构造,可以根据这幅图来理解,
当
占
很少比例(即图像的边缘部分),尽可能的不让随机点去计算这些值,这样的“拟合”积分较好(面积),否则很多的随机点在
外,为计算小比例的东西做贡献,这样必定精度较差,所以我们要期望尽可能的值出现在峰值处。我们称其为“重要性”抽样。理论分析,
,
.
只要选取适当的就可以使方差减少。
当然不可能是,这在图的模拟便可知,
不可能与
相合的同时,还有
。但是
难以选择,需要对问题先验有了一定的了解程度才能适当选取。比如对于正态分布求
,我不太好选
,就没有做相关的模拟了。
- 控制变量法。
核心也是构造,数学式子.
需要已知,但是这是同重要性抽样一样,都不知道,也需要对问题先验有了一定的了解程度,才能好的选择,使
已知,并且有
。相关模拟我也没有再做
- 分层抽样。核心就是将原来的
总之,正如书中所言,减小误差都只是具有指导思想的意义,具体问题,往往需要我们对被积函数有先验的了解,才能够减小误差,提高精度。确实如此,我的例子都是比较特殊或者简单的,如果对于复杂的问题,而且对该函数比较怪异少见,那么在以上的方法中寻找什么,都是一项非常艰巨或者不可能完成的任务。因此,我下一结论,奇技淫巧之所以巧无外乎我们有了个千里眼和顺风耳,瞎碰瞎撞弄出一个巧妙的解法那是很难的,大部分都是前人解法突然激发灵感得来(此时此刻竟想起了贝叶斯来...)。所以对于专门解决高维积分强有力算法——Metropolis算法我是敬佩有加,这一算法2000年惊被评为20世纪十大算法之一。后面产生的什么模拟退火,拟
都与他有莫大的渊源。而伟大的东西终究充满了高深而深刻的东西,我目前楞死没有看太明白,已经被符号给堆死了。但是我想过段时间在查阅相关资料应该可以弄明白吧。
最后再扯句从中学到了的随机向量的构造——正态分布随机变量——Box-Muller法
以前学的是用n个均匀分布随机数由中心极限定律构造,但是那个要得到较好的精度需要N很大,故需要精确的还是用上面的那个方法更比较有保证,咱看公式也心安嘛。
期待关于Metropolis方法之精彩博文:)
竟然把你的评论误了,该打...
Metropolis暂时还不敢问津,有点惧之。目前看分形方面的理论东西已经仙仙欲死了...
虽说 I can't get all of it, 大概能理解个六七分吧 有为青年啊 .. 好好修改充实一下投稿到谢老大的地盘吧? 有些地方写得有点过于简略了 我这种学术功底浅浅的人读起来困难啊
部分LaTeX公式有点瑕疵 比如少一半括号之类的.
WP CodeBox 没给你装? 没有的话搜一个装上.
用法:
代码
lang="LANGUAGE":代码的语言 参照太云的用法 用Ruby的高亮方案就好
file="download.txt":创建一个可下载的保存名称
line="N":开始行数
colla="+/-": ”+“表示展开,”-“表示收缩
还有 我极度推荐扫一眼王垠的文章:
http://docs.huihoo.com/homepage/shredderyin/tex/tex_formula.html
《怎样输入完美的TeX公式》
公式还有改进的空间.
虽然我总是输入不完美的
再次修改了一下,你可以再看下,应该不太和谐的地方少了不少吧...TeX公式那个很受用,不错不错
至于里面的内容,理论证明我是尽量简化了,不然会让文章很长,和本教材没有太大的区别。如果你想研究,可以借书给你看。
谢老大那里呀,水平不够还是不敢贸然前往,毕竟众人围观下,四目相望,惧之也...
能提供书的douban地址么?thanks
我已经忘记是哪本书了。。三年多了...依稀记得当年看的貌似是这本书http://book.douban.com/subject/1811284/