蒙特卡洛方法简介及其python实现

分类: 算法 |
昨晚上课,有同学在讲论文的时候讲到了蒙特卡洛方法,之前在学习DQN的时候,在推导q-function时也看过这个蒙特卡洛方法,那这到底是啥呢?
引用wiki上的一段话:蒙特卡洛方法(英语:Monte Carlo method),也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。20世纪40年代,在冯·诺伊曼,斯塔尼斯拉夫·乌拉姆和尼古拉斯·梅特罗波利斯在洛斯阿拉莫斯国家实验室为核武器计划工作时,发明了蒙特卡洛方法。因为乌拉姆的叔叔经常在蒙特卡洛赌场输钱得名,而蒙特卡罗方法正是以概率为基础的方法。与它对应的是确定性算法。
1、圆周率http://s5/mw690/004igrvszy77sBUu0Bu84&690
第一个例子是,如何用蒙特卡罗方法计算圆周率π。正方形内部有一个相切的圆,它们的面积之比是π/4。
http://mmbiz.qpic.cn/mmbiz_png/KdayOo3PqHCcUVR5rarpch7lUB6hRfpueuqibnE07UI5ibGVClwuqYwxk5PLW2p0euojoNwWuSlCgrXaHTnoKIlw/0?wx_fmt=png
http://mmbiz.qpic.cn/mmbiz_png/KdayOo3PqHCcUVR5rarpch7lUB6hRfpucSm7DFQka9GbGcPkfzXNKKdeGnu7T7b4FXWAmty9iaKWP5mjHF56wEw/0?wx_fmt=png
如果这些点均匀分布,那么圆内的点应该占到所有点的
π/4,因此将这个比值乘以4,就是π的值。
2、积分问题:
http://mmbiz.qpic.cn/mmbiz_png/KdayOo3PqHCcUVR5rarpch7lUB6hRfpu5kBQ5vLVGCfeiaS78icV92wicHCEDzQ2UvlZ7MlrYdfiadPpP7zFt62RPw/0?wx_fmt=png
从上面的图就可以看出来了,在函数内的点的数目占长方形中随机点的数目的比例,也就是积分的面积比,简直是6得不行。蒙特卡洛方法还可以应用到很多方面,比如在金融工程学,宏观经济学,生物医学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域都有广泛应用。
我写了两个python的小例子,一个是关于圆周率http://s1/mw690/004igrvszy77sCBFB3G40&690的估计,一个是求函数区间的最大值,先上代码:
PI的估计程序:
http://s8/mw690/004igrvszy77sF7yip117&690
函数最值的程序:
http://s2/mw690/004igrvszy77sFcp6Xnd1&690
这里面就说一下lambda表达式,简单的理解就是快速定义一个函数,非常方便啊!!!
我很任性的在PI.py程序中给了100000000个点,运行了差不多一分钟才出来。。。。
结果如下:
http://s10/mw690/004igrvszy77sDl00Qxa9&690
不想写代码的小伙伴也可以去我的github:Monte Carlohttp://www/uc/myshow/blog/misc/gif/E___6721EN00SIGG.gif
总而言之,蒙特卡洛方法的含义其实很好理解,就是不断的尝试,总会得到想要的,由于随机的统计,所以概率分布可以揭示一些很直观的东西,比如积分,我才入门,写得不对的地方,希望大家多多指教,共同进步!
引用wiki上的一段话:蒙特卡洛方法(英语:Monte Carlo method),也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。20世纪40年代,在冯·诺伊曼,斯塔尼斯拉夫·乌拉姆和尼古拉斯·梅特罗波利斯在洛斯阿拉莫斯国家实验室为核武器计划工作时,发明了蒙特卡洛方法。因为乌拉姆的叔叔经常在蒙特卡洛赌场输钱得名,而蒙特卡罗方法正是以概率为基础的方法。与它对应的是确定性算法。
1、圆周率http://s5/mw690/004igrvszy77sBUu0Bu84&690
第一个例子是,如何用蒙特卡罗方法计算圆周率π。正方形内部有一个相切的圆,它们的面积之比是π/4。
http://mmbiz.qpic.cn/mmbiz_png/KdayOo3PqHCcUVR5rarpch7lUB6hRfpueuqibnE07UI5ibGVClwuqYwxk5PLW2p0euojoNwWuSlCgrXaHTnoKIlw/0?wx_fmt=png
http://mmbiz.qpic.cn/mmbiz_png/KdayOo3PqHCcUVR5rarpch7lUB6hRfpucSm7DFQka9GbGcPkfzXNKKdeGnu7T7b4FXWAmty9iaKWP5mjHF56wEw/0?wx_fmt=png
2、积分问题:
从上面的图就可以看出来了,在函数内的点的数目占长方形中随机点的数目的比例,也就是积分的面积比,简直是6得不行。蒙特卡洛方法还可以应用到很多方面,比如在金融工程学,宏观经济学,生物医学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域都有广泛应用。
我写了两个python的小例子,一个是关于圆周率http://s1/mw690/004igrvszy77sCBFB3G40&690的估计,一个是求函数区间的最大值,先上代码:
PI的估计程序:
http://s8/mw690/004igrvszy77sF7yip117&690
函数最值的程序:
http://s2/mw690/004igrvszy77sFcp6Xnd1&690
这里面就说一下lambda表达式,简单的理解就是快速定义一个函数,非常方便啊!!!
我很任性的在PI.py程序中给了100000000个点,运行了差不多一分钟才出来。。。。
结果如下:
http://s10/mw690/004igrvszy77sDl00Qxa9&690
不想写代码的小伙伴也可以去我的github:Monte Carlohttp://www/uc/myshow/blog/misc/gif/E___6721EN00SIGG.gif
总而言之,蒙特卡洛方法的含义其实很好理解,就是不断的尝试,总会得到想要的,由于随机的统计,所以概率分布可以揭示一些很直观的东西,比如积分,我才入门,写得不对的地方,希望大家多多指教,共同进步!
前一篇:2016年12月22日
后一篇:一起玩玩makefile