您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

用Python实现蒙特卡罗模拟的详细教程

时间:2020-11-10 10:19:22  来源:  作者:
用Python实现蒙特卡罗模拟的详细教程

 

> Figure 1: The Monte Carlo Simulation method is used in many industries, from the stock market to finance, energy, banking, and other forecasting models. | Source: Pexels

Python/ target=_blank class=infotextkey>Python 的蒙特卡罗仿真方法和应用程序的深入教程

作者:普拉蒂克·舒克拉,罗伯托·伊里翁多

什么是蒙特卡罗模拟?

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

风险分析是我们几乎做出的每一个决策的一部分,因为我们不断面对生活中的不确定性、模糊性和多变性。此外,尽管我们拥有前所未有的信息获取机会,也无法准确预测未来。

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

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

资源:谷歌科拉布实施 |Github

应用:

  • · 金融
  • · 能源
  • · 制造
  • · 工程
  • · 研发
  • · 保险
  • · 石油和天然气
  • · 运输
  • · 环境
  • · 其他

例子:

· 硬币翻转示例

· 使用圆和方形估算 PI

· 蒙蒂大厅问题

· 布冯投针的问题

· 为什么庄家总是赢

1. 硬币翻转示例:

公平硬币的正面概率为1/2。然而,有什么办法我们可以用实验来证明吗?在此示例中,我们将使用 Monte-Carlo 方法以 5000 次迭代方式模拟硬币翻转,以找出为什么正面或反面的概率始终为 1/2。如果我们重复这个硬币翻转很多,很多次,那么我们可以达到更高的精度,一个确切的答案,我们的概率值。

用Python实现蒙特卡罗模拟的详细教程

> Figure 2: Heads and tails, mathematical representation.

 

翻转硬币时:

用Python实现蒙特卡罗模拟的详细教程

> Figure 3: Formula for heads and tails coin example.

 

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

Python 实现:

· 导入所需的库:

用Python实现蒙特卡罗模拟的详细教程

> Figure 4: Import the required libraries for our coin flipping example.

 

1. 硬币翻转功能:

用Python实现蒙特卡罗模拟的详细教程

> Figure 5: A simple function randomizing the results between 0 and 1, 0 for heads, and 1 for tails.

 

2. 检查函数的输出:

用Python实现蒙特卡罗模拟的详细教程

> Figure 6: Running the function of coin_flip()

 

3. 主函数:

用Python实现蒙特卡罗模拟的详细教程

> Figure 7: Calculating the probability and Appending the probability values to the results.

 

4. 调用主函数:

用Python实现蒙特卡罗模拟的详细教程

> Figure 8: Calling the Monte Carlo main function, along with plotting final values.

 

如图 8 所示,我们显示 5000 次迭代后,获得反面的概率为 0.502。因此,我们如何使用蒙特卡罗模拟来实验地找到概率。

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

用Python实现蒙特卡罗模拟的详细教程

> Figure 9: Simple area of a circle and of a square.

 

用Python实现蒙特卡罗模拟的详细教程

> Figure 10: Calculation of the area of a circle and square respectively.

 

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

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

Python 实现:

1.导入所需的库:

用Python实现蒙特卡罗模拟的详细教程

> Figure 10: Importing required libraries for our π example.

 

2.可视化作图

用Python实现蒙特卡罗模拟的详细教程

> Figure 11: Drawing the figures.

 

3. 初始化一些必需的数据:

用Python实现蒙特卡罗模拟的详细教程

> Figure 12: Initializing data values.

 

4. 主函数:

用Python实现蒙特卡罗模拟的详细教程

> Figure 13: Implementing the main function.

 

5. 绘制数据:

用Python实现蒙特卡罗模拟的详细教程

> Figure 14: Plotting the data values.

 

6. 输出:

用Python实现蒙特卡罗模拟的详细教程

> Figure 15: π approximations using the Monte Carlo methodology.

 

用Python实现蒙特卡罗模拟的详细教程

> Figure 16: Data visualization of the values.

 

用Python实现蒙特卡罗模拟的详细教程

> Figure 17: Data visualization of the values.

 

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

用Python实现蒙特卡罗模拟的详细教程

 

通过 Python 中的代码示例,查看初学者的机器学习算法概述。

3. 蒙蒂大厅问题:

假设你在游戏表演,你可以选择选择三扇门之一:一扇门后面是一辆车;在其他门后面,山羊。你选一扇门,让我们说门1,主人,谁知道门后面是什么,打开另一扇门,说门3,它有一只山羊。然后主人问你:你是要坚持自己的选择还是选择另一扇门?[1]

切换您选择的门对您有利吗?

根据概率,事实证明,切换门对我们有利。让我们了解如何:

最初,对于所有三个门,获得汽车的概率 (P) 是相同的 (P = 1/3)。

用Python实现蒙特卡罗模拟的详细教程

 

> Figure 18: A simulation of the three gates for our game show, showcasing each of the possible outcomes.

现在假设参赛者选择门 1。接下来,主人打开第三扇门,它有一只山羊。接下来,主持人问参赛者是否想换门?

我们将了解为什么切换门更有利:

用Python实现蒙特卡罗模拟的详细教程

> Figure 19: A figurative outcome for the door gameshow.

 

在图 19 中,我们可以看到主机打开车门 3 后,最后两扇门有车的概率增加至 2/3。现在我们知道第三扇门有一只山羊,第二扇门有车的概率增加到2/3。因此,切换门更有利。

 

Python 实现:

1.导入所需的库:

用Python实现蒙特卡罗模拟的详细教程

> Figure 20: Importing required libraries for our game show example.

 

2. 初始化某些数据:

用Python实现蒙特卡罗模拟的详细教程

> Figure 21: Initializing the doors and empty lists to store the probability values.

 

3. 主函数:

用Python实现蒙特卡罗模拟的详细教程

> Figure 22: Implementing the main function with a Monte Carlo Simulation method.

 

4. 调用主函数:

用Python实现蒙特卡罗模拟的详细教程

> Figure 23: Calling the main function of our game show example, and interesting 1000 times.

 

5. 输出:

用Python实现蒙特卡罗模拟的详细教程

> Figure 24: Approximate winning probabilities to sticking with your choice or switching doors.

在图 24 中,我们显示 1000 次迭代后,如果我们切换门,获胜概率为 0.669。因此,我们相信,在此示例中切换门对我们的优势是管用。

4. 布冯投针的问题:

1777年[2][3],法国贵族乔治-路易斯·勒克莱克(Comte de Buffon)发布了以下问题。

假设我们把一根短针掉在有横条的纸上——针头躺在穿过其中一条线的位置的概率是多少?

概率取决于被统治纸张的线之间的距离 (d),它取决于我们掉落的针的长度 (l),或者更确切地说,它取决于比率 l/d。对于此示例,我们可以将针头解释为 l ≤ d。简而言之,我们的目的是针不能同时穿过两条不同的线。令人惊讶的是,布冯的针头问题的答案涉及PI。

在这里,我们将使用布冯的针头问题的解决方案,以实验方式使用蒙特卡罗方法估计PI的价值。然而,在进入之前,我们将展示解决方案是如何派生的,使其更有趣。

定理:

如果将长度为 l 的短针掉到以相同距离 d ≥ l 的相等空间线裁定的纸张上,则针位于穿过其中一条线的位置的概率为:

用Python实现蒙特卡罗模拟的详细教程

> Figure 25: Buffon's needle problem theorem.

 

可视化投针问题

用Python实现蒙特卡罗模拟的详细教程

> Figure 26: Visualizing Buffon's needle problem.

 

接下来,我们需要计算穿过任何垂直线的针数。对于要与其中一条线相交的指针,对于 theta 的特定值,以下是针与垂直线相交的最大值和最小可能值。

1.最大可能值:

用Python实现蒙特卡罗模拟的详细教程

> Figure 27: Maximum possible value.

 

2. 最小可能值:

用Python实现蒙特卡罗模拟的详细教程

> Figure 28: Minimum possible value.

 

因此,对于 theta 的特定值,针位于垂直线上的概率为:

用Python实现蒙特卡罗模拟的详细教程

> Figure 29: Probability for a needle to lie on a vertical line formula.

 

上述概率公式仅限于一个值;在我们的实验中,theta 的值范围从0到pi/2。接下来,我们将通过集成它来查找实际概率,以结合所有 to 的值。

用Python实现蒙特卡罗模拟的详细教程

> Figure 30: Probability formula by integrating all possible values for theta.

 

用Python实现蒙特卡罗模拟的详细教程

> Figure 31: PI estimation.

 

使用布冯投针问题估算 PI:

接下来,我们将使用上述公式来实验找出PI的值。

用Python实现蒙特卡罗模拟的详细教程

> Figure 32: Finding the value of PI.

 

现在,请注意,我们有 l 和 d 的值。我们的目标是首先找到 P 的值,以便获得 PI 的值。要找到概率P,我们必须需要打针和总针的计数。由于我们已经有总针的计数,我们现在唯一需要的东西是打针的计数。

下面是我们如何计算命中针数的可视化表示。

用Python实现蒙特卡罗模拟的详细教程

> Figure 33: Visual representation to calculate the count of needles.

 

Python 实现:

1.导入所需的库:

用Python实现蒙特卡罗模拟的详细教程

> Figure 34: Importing the required libraries for our problem.

 

3. 主函数:

用Python实现蒙特卡罗模拟的详细教程

> Figure 35: Implementing the Monte Carlo Simulation method to our Buffon problem.

 

3. 调用主函数:

用Python实现蒙特卡罗模拟的详细教程

> Figure 36: Calling the Monte Carlo Method's main function to our Buffon's problem.

 

4. 输出:

用Python实现蒙特卡罗模拟的详细教程

> Figure 37: Data visualization of 100 iterations using the Monte Carlo Method.


用Python实现蒙特卡罗模拟的详细教程

> Source: 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美元去的会被庄家赢走。相比之下,轮盘赌的最低庄家边缘为2.5%。因此,我们确信,你将有更好的机会赢得我们想象中的游戏轮盘赌。

Python 实现:

1.导入所需的库:

用Python实现蒙特卡罗模拟的详细教程

> Figure 38: Importing the required libraries for our casino problem.

 

2.初始化

用Python实现蒙特卡罗模拟的详细教程

> Figure 39: Placing bets for odds and even numbers.

 

3. 主函数:

用Python实现蒙特卡罗模拟的详细教程

> Figure 40: Applying the Monte Carlo Methodology to our casino problem.

 

4. 最终输出:

用Python实现蒙特卡罗模拟的详细教程

> Figure 41: Calculating and displaying the final values.

 

5. 运行 1000 次迭代:

用Python实现蒙特卡罗模拟的详细教程

> Figure 42: Running our function 1000 times.

 

6. 投注数量 = 5:

用Python实现蒙特卡罗模拟的详细教程

> Figure 43: Data visualization of results when the number of bets equals five.

 

7. 投注数量 = 10:

用Python实现蒙特卡罗模拟的详细教程

> Figure 44: Data visualization of results when the number of bets equals ten.

 

8. 投注数量 = 1000:

用Python实现蒙特卡罗模拟的详细教程

> Figure 45: Data visualization of results when the number of bets equals 1000.

 

9. 投注数量 = 5000:

用Python实现蒙特卡罗模拟的详细教程

> Figure 46: Data visualization of results when the number of bets equals 5000.

 

10. 投注数量 = 10000:

用Python实现蒙特卡罗模拟的详细教程

> Figure 47: Data visualization of results when the number of bets equals 10000.

从上面的实验中,我们可以看到,如果玩家在这些游戏上下注较少,他们有更好的盈利机会。在某些情况下,我们得到负数,这意味着玩家失去了所有的钱和累积的债务,而不是盈利。

请记住,这些百分比是我们的模拟游戏,他们可以修改。

结论:

与任何预测模型一样,仿真将只像我们估计得一样好。重要的是要记住,蒙特卡罗模拟只代表概率,而不是确定性。然而,蒙特卡罗模拟可以是一个有价值的工具,当预测一个未知的未来。

详细介绍我们的神经网络教程,详细介绍 Python 代码和数学

免责声明:本文所表达的观点是作者的观点,并不代表卡内基梅隆大学的观点。这些著作并不打算成为最终产品,而是反映当前思维,同时成为讨论和改进的催化剂。

引用:

[1] 概率问题报价, 21 电影, https://www.imdb.com/title/tt0478087/characters/nm0000228#quotes

[2] 乔治-路易斯·勒克莱克,布冯伯爵,维基百科,https://en.wikipedia.org/wiki/Georges-Louis_Leclerc,_Comte_de_Buffon

[3] 布冯投针问题,维基百科,https://en.wikipedia.org/wiki/Buffon%27s_needle_problem

 

(本文翻译自Towards AI Team的文章《Monte Carlo Simulation An In-depth Tutorial with Python》,参考:https://medium.com/towards-artificial-intelligence/monte-carlo-simulation-an-in-depth-tutorial-with-python-bcf6eb7856c8)



Tags:Python 蒙特卡罗模拟   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
> Figure 1: The Monte Carlo Simulation method is used in many industries, from the stock market to finance, energy, banking, and other forecasting models. | So...【详细内容】
2020-11-10  Tags: Python 蒙特卡罗模拟  点击:(182)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条