原标题:蒙特卡洛模拟(Python)深入教程

字幕组双语原文:蒙特卡洛模拟(Python)深入教程

英语原文:Monte Carlo Simulation An In-depth Tutorial with Python

翻译:、

什么是蒙特卡罗模拟?

蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的技术。 蒙特卡罗模拟或概率模拟是一种技术,用于了解金融部门、项目管理、成本和其他预测机器学习模型中风险和不确定性的影响。

风险分析几乎是我们做出的每一个决定的一部分,因为我们在生活中经常面临不确定性、模糊性和变化无常。 此外,即使我们拥有前所未有的信息获取渠道,我们也不能准确预测未来。

蒙特卡洛模拟使我们能够看到决策的所有可能结果,并评估风险影响,从而在不确定的情况下更好地做出决策。

在本文中,我们将通过五个不同的例子来理解蒙特卡罗模拟方法。

资源: Google Colab Implementation | GitHub Repository

应用领域:

金融

项目管理

能量

制造业

工程学

研究和开发

保险

石油和天然气公司

交通

环境

还有其他举例:

抛硬币示例

用圆和平方估计PI

三门问题

蒲丰投针问题

为什么赌场总是赚的?a. 抛硬币示例:

抛硬币中奖的概率是1/2。但是,我们有没有办法从实验上证明这一点呢? 在这个例子中,我们将使用蒙特卡罗方法迭代地模拟抛硬币5000次,以找出为什么头部或尾巴的概率总是1/2。如果我们重复抛硬币很多很多次,那么我们可以在概率值的准确答案上获得更高的精确度。在这个例子中,我们将使用Monte-Carlo方法反复模拟抛硬币5000次,以找出头部或尾部的概率始终是1/2的概率。

图2:正面和反面,数学表示。

在抛硬币时:

图3:正面和反面硬币的公式示例。

接下来,我们将用蒙特卡罗方法对这个公式进行实验证明。

Python实现:

1.导入所需的库:

图4:为我们的抛硬币示例导入所需的库。

2.投币功能:

图5:一个简单的函数,将结果随机排列在0和1之间,头部为0,尾部为1。

3.检查函数输出:

图6:运行Coin_Flip函数

4.主要功能:

图7:计算概率并将概率值附加到结果。

5.调用main函数:

图8:调用Monte Carlo主函数,并绘制最终值。

如图8所示,我们显示在5,000次迭代之后,获得尾部的概率为0.502。 因此,这就是我们可以如何使用蒙特卡罗模拟来通过实验找到概率的方法。

b.使用圆形和正方形估算PI:

图9:圆形和正方形的简单面积。

图10:分别计算圆形和正方形的面积。

要估计PI的值,我们需要正方形的面积和圆的面积。 为了找到这些区域,我们将在表面上随机放置点,并计算落在圆内的点和落在正方形内的点。 这将给我们一个估计的面积。 因此,我们将使用点数作为面积,而不是使用实际面积。

在下面的代码中,我们使用Python的Turtle模块来查看点的随机放置。

python实现:

1.导入需要的库

图10:为我们的π示例导入所需的库。

2.可视化这些点:

图11:绘制图形。

3.初始化部分必填数据:

图12:初始化数据值。

4.主要功能:

图13:实现主功能。

5.绘制数据:

图14:绘制数据值。

6.输出

图15:使用蒙特卡罗方法的π近似。

图16:值的数据可视化。

图17:值的数据可视化。

如图17所示,我们可以看到,经过5000次迭代后,我们可以得到PI的近似值。 另外,请注意,随着迭代次数的增加,估计误差也呈指数下降。

3. 三门问题:

假设你正在参加一个游戏节目,你可以从三扇门中选择一扇:一扇门后面是一辆汽车;另一扇门后面是山羊。 你选了一扇门,假设是1号门,主人,谁知道门后面有什么,就打开另一扇门,比如说3号门,里面有一只山羊。 主人然后问你:你是坚持自己的选择,还是选择另一扇门?

选择不同的门对你有好处吗? 事实证明,从概率上说,打开门对我们有利。具体分析:最初,对于所有的三个门,得到车的概率(P)是相同的(P = 1/3)。

图18:三个门的模拟,展示了每个可能的结果。

现在假设参赛者选择了门1。接下来,主人打开第三扇门,里面有一只山羊。接下来,主持人问参赛者是否要换门?我们将看到为什么转换门更有利:

图19:门的图示结果。

在图19中,我们可以看到在主人打开门3之后,拥有一辆车的最后两个门的概率增加到2/3。现在我们知道第三扇门有一只山羊,第二扇门有一辆车的概率增加到2/3。因此,换门更为有利。现在我们将使用蒙特卡罗方法来多次执行这个测试案例,并通过实验的方式找出它的概率。

Python 实现:

1. Import所需库:

图20: 导入所需库。

2. 初始化数据:

图21: 初始化代表门的枚举变量和存储概率值的列表。

3. Main函数:

图22: 用蒙特卡洛模拟来实现主函数。

4. 调用main函数:

图23: 调用主函数模拟1000次博弈。

5. 输出:

图24: 得到坚持自己的选择或换门的近似获胜概率。

在图24中,我们发现在1000次模拟后,如果我们换门,获胜概率是0.669。因此,我们确信在本例中换门对我们更有利。

4. 蒲丰投针问题:

法国贵族Georges-Louis Leclerc,即蒲丰公爵在1777年提出了这样一个问题[2] [3]:

若在一张绘有等距平行线的纸上随意抛一根短针,求针和任意一条线相交的概率。

概率取决于方格纸的线间距(d),和针长度(l)——或者说,它取决于l/d的比值。在这个例子里,我们可以认为针长度l≤d。简而言之,我们假设了针不能同时相交于两条不同的线。令人惊讶的是,蒲丰针问题的答案与PI相关。

这里,我们将使用用蒙特卡洛法来解蒲丰投针问题,顺便估计出PI的值。不过在此之前,我们要先展示一下解法是如何推导出来的,这样会更有趣。

定理:

如果一根长为l的短针落在一张纸上,而纸上画有距离d≥l的等距线,那么针与任一条线相交的概率为:

图25: 蒲丰投针定理。

证明:

图26: 蒲丰投针问题的可视化。

首先,我们需要统计出与任意垂线相交的针的数量。若针与任意一条线相交,对于特定的θ值,针与垂线相交的最大和最小可能值为:

最大可能值:

图27: 最大概率值。

最小可能值:

图28: 最小可能值。

因此, 对于特定的θ值,针在垂线上的概率是:

图29: 针与垂线相交的概率公式。

这个概率公式局限于特定θ值,在本实验中,θ的范围是0到pi/2。所以,我们需要对所有的θ值做一个积分,得到投针相交的实际概率。

图 30: 对所有θ值积分的投针相交概率公式。

图 31: PI的估计值。

由蒲丰投针问题来估计PI:

接下来,我们要用上面的公式来进行实验求得PI值。

图 32: 求PI值。

现在,因为我们已经知道了l和d的值,所以只要求得了P的值,我们就可以推知PI的值。而要得到概率P,必须要知道相交针数和总针数, 这里的总针数是已知的。

下图是计算相交针数的直观图解。

图33: 可视化表示如何计算针的数量。

Python 实现:

Import 所需的库:

图34: 导入所需库。

2. Main 函数:

图35: 用蒙特卡洛方法模拟蒲丰投针。

3. 调用main函数:

图36: 调用main函数模拟蒲丰投针。

4. 输出:

图 37: 使用蒙特卡洛方法模拟100次投针的数据。

如图37所示,经过100次的模拟,蒙特卡洛法就能得出一个非常接近PI的值。

图源: Pexels

5. 为什么赌场总是赚的?

赌场是怎么赚钱的? 诀窍很简单--“你玩得越多,他们赚的就越多。” 让我们通过一个简单的蒙特卡罗模拟示例来看看这是如何工作的。

考虑一个假想的游戏,玩家必须从一袋筹码中选择一个筹码。

规则:

袋子里有数字从1到100的筹码。

用户可以押注于偶数或奇数筹码。

在这个游戏中,10和11是特殊的数字。 如果我们赌偶数,那么10就算奇数,如果我们赌赔率,那么11就算偶数。

如果我们赌偶数,我们得了10,那么我们就输了。

如果我们赌的是奇数,我们得了11,那么我们就输了。

如果我们以赔率下注,我们获胜的概率为49/100。 获胜的概率为51/100。 因此,对于一个奇数下注,彩池优势为= 51 / 100–49 / 100 = 200/10000 = 0.02 = 2%

如果我们打赌偶数,则用户获胜的概率为49/100。 获胜的概率为51/100。 因此,对于一个奇数下注,彩池优势为= 51 / 100–49 / 100 = 200/10000 = 0.02 = 2%

综上所述,每下注1美元,就会有0.02美元下注。 相比之下,轮盘上最低的单一0优势是2.5%。 因此,我们可以肯定,与轮盘赌相比,您在假想的游戏中获胜的机会更大。

Python 实现:

Import所需的库:

图38: 导入赌场模拟所需的库。

2. 玩家下注:

图39: 在下注奇数或偶数。

3. Main 函数:

图 40: 使用蒙特卡洛方法模拟赌场行为。

4. 最终输出:

图41: 计算并展示计算结果。

5. 模拟1000次试试:

图 42: 模拟1000次。

6. 下注数 = 5:

图43: 下注5次时的结果可视化。

7. 下注数 = 10:

图44: 下注10次时的结果可视化。

8. 下注数 = 1000:

图45: 下注1000次时的结果可视化。

9. 下注数 = 5000:

图46: 下注5000次时的结果可视化。

10. 下注数 = 10000:

图47: 下注10000次时的结果可视化。

从上面的实验中,我们可以看到,如果玩家在赌博中下注较少,那么有得赚的机会就比较大。有时候实验会得到负数,这意味着玩家输得倾家荡产负债累累,而不是单车变路虎。

请注意, 这些比例源于为促进理解的非真实场景,认不赌为赢。

结论:

就像任何预测模型一样 模拟结果只有我们的估计值才是好的 重要的是要记住,蒙特卡洛模拟只代表概率而不是确定性。尽管如此,在预测未知的未来时,蒙特卡洛模拟是一个有价值的工具。

声明:本文所表达的观点仅代表作者本人,不代表CMU的观点。这些文字并非为最终成品,仅为当下思考记录以促进学习和交流。

雷锋字幕组是一个由AI爱好者组成的翻译团队,汇聚五五多位志愿者的力量,分享最新的海外AI资讯,交流关于人工智能技术领域的行业转变与技术创新的见解。

团队成员有大数据专家,算法工程师,图像处理工程师,产品经理,产品运营,IT咨询人,在校师生;志愿者们来自IBM,AVL,Adobe,阿里,百度等知名企业,北大,清华,港大,中科院,南卡罗莱纳大学,早稻田大学等海内外高校研究所。

如果,你也是位热爱分享的AI爱好者。欢迎与雷锋字幕组一起,学习新知,分享成长。返回搜狐,查看更多

责任编辑:

python 蒙特卡罗_蒙特卡洛模拟(Python)深入教程相关推荐

  1. Python: CIR过程蒙特卡洛模拟

    Python: CIR过程蒙特卡洛模拟 众所周知,利率是随着时间的变化而随机变化的,本文简要说明了两种常用的随机利率过程,并基于Python用蒙特卡洛的方法对随机利率进行模拟. (未完待续 -) In ...

  2. Python中表示偶数_蒙特卡洛模拟(Python)深入教程

    译者:大表哥.wiige来源:AI研习社 什么是蒙特卡罗模拟? 蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的技术.蒙特卡罗模拟或概率模拟是一种技术,用于了解金融部门.项目管理.成本和其他预测机器 ...

  3. python 蒙特卡洛模拟股价_12 Python总结之蒙特卡洛模拟

    蒙特卡洛模拟 蒙特卡洛模拟是金融学和数值科学中最重要的算法之一.它之所以重要,是因为在期权定价或者风险管理问题上有很强的能力.和其它数值方法相比,蒙特卡洛方法很容易处理高维问题,在这种问题上复杂度和计 ...

  4. 12 Python总结之蒙特卡洛模拟

    蒙特卡洛模拟 蒙特卡洛模拟是金融学和数值科学中最重要的算法之一.它之所以重要,是因为在期权定价或者风险管理问题上有很强的能力.和其它数值方法相比,蒙特卡洛方法很容易处理高维问题,在这种问题上复杂度和计 ...

  5. 初学者怎么自学python编程_怎样自学python编程?从零开始学习python,400集免费教程!...

    作为小白,在学习Python的时候,必然会走一定的弯路,有人在弯路上走丢了,有人走出了弯路.我就是属于还未走出弯路的同学,所以我想谈谈我的Python学习之路. 01先了解一下什么是python‍? ...

  6. 怎么查看电脑有没有python_python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学...

    本文由简码编程原创,保留所有版权,转载请注明出处. 本python人工智能爬虫系列教程基于Python3.0版本, 将python结合windows桌面开发工具aardio一起做可视化的开发, 用py ...

  7. python马尔可夫链_[译] 用 Python 实现马尔可夫链的初级教程

    马尔可夫链是通常用一组随机变量定义的数学系统,可以根据具体的概率规则进行状态转移.转移的集合满足 马尔可夫性质 ,也就是说,转移到任一特定状态的概率只取决于当前状态和所用时间,而与其之前的状态序列无关 ...

  8. 用 Python 中的蒙特卡洛模拟预测股票收益

    蒙特卡洛方法(或蒙特卡洛实验)是一大类计算算法,它们依赖于重复随机采样来获得数值结果.基本思想是使用随机性来解决原则上可能是确定性的问题.它们通常用于物理和数学问题,并且在难以或不可能使用其他方法时最 ...

  9. 爬虫python对电脑要求_python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学...

    本文由简码编程原创,保留所有版权,转载请注明出处. 本python人工智能爬虫系列教程基于Python3.0版本, 将python结合windows桌面开发工具aardio一起做可视化的开发, 用py ...

最新文章

  1. python excel行数_使用python计算excel中的行数
  2. KaliLinuxNetHunter教程刷入第三方Recovery与开始刷机
  3. 【bzoj1369】[Baltic2003]Gem(树形dp+结论)
  4. 使用apache POI把list集合里面的实体写入Excel(java)
  5. Navicat for MySQL出现1030-Got error 28 from storage engine错误
  6. WordPress Plupload插件未明跨站脚本漏洞
  7. 服务器电源输出电压稳定,服务器电源选购指南
  8. Google 公开被利用了两年的 iOS 漏洞;微博新推社交产品“绿洲”;微软全新终端 v0.4 发布 | 极客头条...
  9. 限定某个目录禁止解析php 限制user_agent php相关配置
  10. 图示SaaS:走向平台化,会产生什么变化?
  11. 移动端日期控件 mobiscroll
  12. DevExpress 破解方式
  13. (日常搬砖)python3.7内置调试器PDB
  14. Excel中index和match函数的应用实例
  15. 2021年上半年软考真题网络工程师真题及答案解析
  16. RS485使用串口输出最后一个字节固定为FF
  17. 百度测试开发面试题整理
  18. PS4 从局域网安装PS4 PKG游戏 | PS4 HEN PS4 Package Sender
  19. 1.1 统计学习方法概论(个人笔记与随感)
  20. 解决uniapp ios手机端获取时间戳出现NAN

热门文章

  1. SQL内连接、外连接、全连接、交叉连接、自连接、自然连接
  2. 自动/持续部署Docker 的tomcat web项目(二)
  3. SSR -- 服务端渲染基础
  4. C#LeetCode刷题之#824-山羊拉丁文​​​​​​​(Goat Latin)
  5. C#LeetCode刷题之#520-检测大写字母(Detect Capital)
  6. Linux入门学习(十)
  7. script和scriptreplay命令实现终端录制和回放。
  8. 尚学堂java答案解析 第三章
  9. html5支持多中浏览器写法,html5及css3对table表格高亮当前行列的多浏览器兼容写法...
  10. mysql 重置表索引_MySQL如何进行索引重建操作?