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中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
python简单获取数组元素个数的方法
Jul 13 Python
浅谈Python的异常处理
Jun 19 Python
python 实现对文件夹内的文件排序编号
Apr 12 Python
Python简单定义与使用二叉树示例
May 11 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
对python指数、幂数拟合curve_fit详解
Dec 29 Python
提升Python程序性能的7个习惯
Apr 14 Python
django url到views参数传递的实例
Jul 19 Python
Python3 读取Word文件方式
Feb 13 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
Python字符串函数strip()原理及用法详解
Jul 23 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 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
2014/02/23 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
pymssql ntext字段调用问题解决方法
2008/12/17 Python
python获得一个月有多少天的方法
2015/06/04 Python
python学生信息管理系统
2018/03/13 Python
Python登录注册验证功能实现
2018/06/18 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
基于python的列表list和集合set操作
2019/11/24 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
详解python tkinter 图片插入问题
2020/09/03 Python
安装python依赖包psycopg2来调用postgresql的操作
2021/01/01 Python
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
社区先进事迹材料
2014/05/19 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
大学生实习证明范本
2014/09/19 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
三严三实心得体会范文
2014/10/13 职场文书
保研导师推荐信
2015/03/25 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书