Python实现蒙特卡洛算法小实验过程详解


Posted in Python onJuly 12, 2019

蒙特卡洛算法思想

蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城—摩纳哥的蒙特卡洛来命名这种方法。

通俗的解释一下蒙特卡洛算法的思想。假如篮子里有1000个苹果,让你每次闭着眼睛拿1个,挑出最大的。于是你闭着眼睛随机拿了一个,然后再随机拿一个与第一个比,留下大的,再随机拿一个,与前次留下的比较,又可以留下大的……你每拿一次,留下的苹果至少是当前最大的,循环往复这样,拿的次数越多,挑出最大苹果的可能性也就越大,但除非你把1000个苹果都挑一遍,否则你无法肯定最终挑出来的就是最大的一个。也就是说,蒙特卡洛算法是样本越多,越能找到最佳的解决办法,但只是尽量找最好的,不保证一定是最好的。

与它形成对比的是拉斯维加斯算法思想。假如有一把锁,有1000把钥匙进行选择,但只有1把是对的。于是你每次随机拿1把钥匙去试,打不开就再换1把。你试的次数越多,打开最优解的机会就越大,但在打开之前,那些错的钥匙都是没有用的。所以拉斯维加斯算法就是尽量找最好的解决办法,但是不保证能找到。假设试了999次后没有任何一把钥匙能打开锁,真正的钥匙是第1000把,但是样本并没有第1000次选择,那么拉斯维加斯算法就不能找到打开锁的钥匙。

蒙特卡洛和拉斯维加斯本身是两座著名赌城,因为赌博中体现了许多随机算法,所以借此命名。它们只是概括了随机算法的特性,算法本身可能复杂,也可能简单,在这两类随机算法之间的选择,往往受到问题的局限。如果问题要求在有限采样内,必须给出一个解,但不要求是最优解,那就要用蒙特卡罗算法。反之,如果问题要求必须给出最优解,但对采样没有限制,那就要用拉斯维加斯算法。

Python实现蒙特卡洛算法小实验过程详解

蒙特卡洛算法实验

这么看来蒙特卡洛方法的理论支撑其实是概率论或统计学中的大数定律。基本原理简单描述是先大量模拟,然后计算一个事件发生的次数,再通过这个发生次数除以总模拟次数,得到想要的结果。下面我们以三个经典的小实验来学习下蒙特卡洛算法思想。

1.计算圆周率pi(π)值

实验原理:在正方形内部有一个相切的圆,圆面积/正方形面积之比是(PixRxR)/(2Rx2R)= Pi/4。在这个正方形内随机产生n个点,假设点落在圆内的概率为P,那么P=圆面积/正方形面积,则P= Pi/4。如何计算点落在圆内的概率P?可以计算点与中心点的距离,判断是否落在圆的内部,若这些点均匀分布,用M表示落到圆内投点数 , N表示总的投点数,则圆周率Pi=4P=4xM/N。

实验步骤:

(1)将圆心设在原点(0,0),以R为半径形成圆,则圆面积为PixRxR

(2)将该圆外接正方形, 坐标为(-R,-R)(R,-R)(R, R)(-R,R),则该正方形面积为R*R

(3)随即取点(X,Y),使得-R <=X<=R并且-R <=Y<=R,即点在正方形内

(4)通过公式 XxX+YxY<= RxR判断点是否在圆周内(直角三角形边长公式)。

(5)设所有点(也就是实验次数)的个数为N,落在圆内的点(满足步骤4的点)的个数为M,则P=M/N,于是Pi=4xM/N。

(6)运行结果为3.143052

def cal_pai_mc(n=1000000):
 r = 1.0
 a, b = (0.0, 0.0)
 x_neg, x_pos = a - r, a + r
 y_neg, y_pos = b - r, b + r
 m = 0
 for i in range(0, n+1):
 x = random.uniform(x_neg, x_pos)
 y = random.uniform(y_neg, y_pos)
 if x**2 + y**2 <= 1.0:
 m += 1
 return (m / float(n)) * 4

2.计算函数定积分值

实验原理:若要求函数f(x)从a到b的定积分,我们可以用一个比较容易算得面积的矩型包围在函数的积分区间上(假设其面积为Area),定积分值其实就是求曲线下方的面积。随机地向这个矩形框里面投点,统计落在函数f(x)下方的点数量占所有点数量的比例为P,那么就可以据此估算出函数f(x)从a到b的定积分为Area×P。此处我们将a和b设为0和1,函数f(x)=x2。

运行结果为0.333749

def cal_integral_mc(n = 1000000):
 x_min, x_max = 0.0, 1.0
 y_min, y_max = 0.0, 1.0
 m = 0
 for i in range(0, n+1):
 x = random.uniform(x_min, x_max)
 y = random.uniform(y_min, y_max)
 # x*x > y 表示该点位于曲线的下面。
 if x*x > y:
 m += 1
 #所求的积分值即为曲线下方的面积与正方形面积的比
 return m / float(n)

3.计算函数极值,可避免陷入局部极值

实验原理:极值是“极大值” 和 “极小值”的统称。如果一个函数在某点的一个邻域内处处都有确定的值,函数在该点的值大于或等于在该点附近任何其他点的函数值,则称函数在该点的值为函数的“极大值”。如果函数在该点的值小于或等于在该点附近任何其他点的函数值,则称函数在该点 的值为函数的“极小值”。此处在区间[-2,2]上随机生成一个数,求出其对应的y,找出其中最大值认为是函数在[-2,2]上的极大值。

运行结果发现极大值185.1204262706596, 极大值点为1.5144491499169481

def cal_extremum_mc(n = 1000000):
 y_max = 0.0
 x_min, x_max = -2.0, 2.0
 y = lambda x:200*np.sin(x)*np.exp(-0.05*x)#匿名函数
 for i in range(0, n+1):
 x0 = random.uniform(x_min, x_max)
 if y(x0) > y_max:
 y_max = y(x0)
 x_max = x0
 return y_max, x_max

以上三个例子也称为基于蒙特卡洛的投点法,由此得出的值并不是一个精确值,而是一个近似值。当投点的数量越来越大时,这个近似值也越接近真实值。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
python利用sklearn包编写决策树源代码
Dec 21 Python
python实现堆和索引堆的代码示例
Mar 19 Python
Python 访问限制 private public的详细介绍
Oct 16 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
python文件写入write()的操作
May 14 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
python django model联合主键的例子
Aug 06 Python
tf.concat中axis的含义与使用详解
Feb 07 Python
Python如何将字符串转换为日期
Jul 31 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 #Python
如何不用安装python就能在.NET里调用Python库
Jul 12 #Python
python 执行终端/控制台命令的例子
Jul 12 #Python
python IDLE 背景以及字体大小的修改方法
Jul 12 #Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 #Python
Python爬虫抓取技术的一些经验
Jul 12 #Python
python 使用装饰器并记录log的示例代码
Jul 12 #Python
You might like
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
2018/08/27 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
python开启debug模式的方法
2019/06/27 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
如何基于python测量代码运行时间
2019/12/25 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
英国精品买手店:Browns Fashion
2016/09/29 全球购物
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
大学生个人简历自我评价
2013/11/16 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
五年级小学生评语
2014/12/26 职场文书
坎儿井导游词
2015/02/09 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
MySQL如何构建数据表索引
2021/05/13 MySQL