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

81e4e61991b1893cad36c1308bb81c70.png

译者:大表哥、wiige来源:AI研习社

7311b7411ccab6b1965c90344b9888f0.png

什么是蒙特卡罗模拟?

蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的技术。蒙特卡罗模拟或概率模拟是一种技术,用于了解金融部门、项目管理、成本和其他预测机器学习模型中风险和不确定性的影响。风险分析几乎是我们做出的每一个决定的一部分,因为我们在生活中经常面临不确定性、模糊性和变化无常。此外,即使我们拥有前所未有的信息获取渠道,我们也不能准确预测未来。蒙特卡洛模拟使我们能够看到决策的所有可能结果,并评估风险影响,从而在不确定的情况下更好地做出决策。在本文中,我们将通过五个不同的例子来理解蒙特卡罗模拟方法。

应用领域:金融、项目管理、能量、制造业、工程学、研究和开发、保险、石油和天然气公司、交通、环境等。

举例:

  • 抛硬币示例
  • 用圆和平方估计PI
  • 三门问题
  • 蒲丰投针问题

  • 为什么赌场总是赚的?

cd7b1be3659e25c3bac18de4ba6164a6.png

抛硬币示例  

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

Python实现:

1.导入所需的库:26a66ee21ee0e7930162ed52f0787087.png为我们的抛硬币示例导入所需的库2.投币功能:7c25ccf87dce3660320ebc6bfa6acd55.png一个简单的函数,将结果随机排列在0和1之间,头部为0,尾部为13.检查函数输出:0bc2a8d21d920344e608caaeb3533f6e.png运行Coin_Flip()函数4.主要功能:71f6b5eb1bc48e87b58e86e8a0283d8a.png计算概率并将概率值附加到结果5.调用main函数:3ffcf506dd06bde32c024a1cdca84603.png调用Monte Carlo主函数,并绘制最终值如图8所示,我们显示在5,000次迭代之后,获得尾部的概率为0.502。因此,这就是我们可以如何使用蒙特卡罗模拟来通过实验找到概率的方法。

48ea05495227b7246de8fb5af846a81d.png

使用圆形和正方形估算PI

b21767578277ecc818418090fb6effba.png圆形和正方形的简单面积13de7c5eed83a34a911bc1b12b984ac5.png分别计算圆形和正方形的面积要估计PI的值,我们需要正方形的面积和圆的面积。为了找到这些区域,我们将在表面上随机放置点,并计算落在圆内的点和落在正方形内的点。这将给我们一个估计的面积。因此,我们将使用点数作为面积,而不是使用实际面积。在下面的代码中,我们使用Python的Turtle模块来查看点的随机放置。

python实现:

1.导入需要的库e360966e74a6f854ae48c1fbf45e891e.png为我们的π示例导入所需的库2.可视化这些点:d7f2ecc189cf838276394ef071d7ac1d.png绘制图形3.初始化部分必填数据:22f92d01d9eef4eb6875d62fa9f05c17.png初始化数据值4.主要功能:3aec8cf9756b51236fbe0ecf598ae1eb.png实现主功能5.绘制数据:438f13679ec938887a5d6108e17a626e.png绘制数据值6.输出0e14a3fe49d393da5dc08714f8c7a37a.png图15:使用蒙特卡罗方法的π近似。00538104c8b87c77d1e7c69ac075924c.png值的数据可视化8a50d9ee20057b173301a6056f0333b9.png值的数据可视化如上图所示,我们可以看到,经过5000次迭代后,我们可以得到PI的近似值。另外,请注意,随着迭代次数的增加,估计误差也呈指数下降。3320df1b322bba74560829f126a2228e.png

e9fb9a1918e711d70c4376b3e40e8626.png

三门问题

假设你正在参加一个游戏节目,你可以从三扇门中选择一扇:一扇门后面是一辆汽车;另一扇门后面是山羊。你选了一扇门,假设是1号门,主人,谁知道门后面有什么,就打开另一扇门,比如说3号门,里面有一只山羊。主人然后问你:你是坚持自己的选择,还是选择另一扇门? 选择不同的门对你有好处吗?  事实证明,从概率上说,打开门对我们有利。具体分析:1f0243f850197b72d6a43c836900b544.png41ca0ab6adfd06e7f42cab00dadc5de7.png导入所需库2. 初始化数据:38b3facb46f4aa202d965be77bb3a8b1.png初始化代表门的枚举变量和存储概率值的列表3. Main函数:57513ba2bd77ef52d7f4fa2b740ecc51.png用蒙特卡洛模拟来实现主函数.4. 调用main函数:7f61447b95b8035a90e47a5887504659.png调用主函数模拟1000次博弈5. 输出:d5bab29ed6c61c16732ff1b9de9bcf77.png得到坚持自己的选择或换门的近似获胜概率.在上图中,我们发现在1000次模拟后,如果我们换门,获胜概率是0.669。因此,我们确信在本例中换门对我们更有利.

b6ef2e4957ea385ec28f8561ee4efb48.png

蒲丰投针问题

法国贵族Georges-Louis Leclerc,即蒲丰公爵在1777年提出了这样一个问题:
若在一张绘有等距平行线的纸上随意抛一根短针,求针和任意一条线相交的概率  
概率取决于方格纸的线间距(d),和针长度(l)——或者说,它取决于l/d的比值。在这个例子里,我们可以认为针长度l≤d。简而言之,我们假设了针不能同时相交于两条不同的线。令人惊讶的是,蒲丰针问题的答案与PI相关。这里,我们将使用用蒙特卡洛法来解蒲丰投针问题,顺便估计出PI的值。不过在此之前,我们要先展示一下解法是如何推导出来的,这样会更有趣。

定理:

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

证明:

ea1bcf8f292e734cd44d77f57ddd34bd.png蒲丰投针问题的可视化首先,我们需要统计出与任意垂线相交的针的数量。若针与任意一条线相交,对于特定的θ值,针与垂线相交的最大和最小可能值为:最大可能值:afcc7e2515a0d2d646ab49b4aa55d5dc.png最大概率值2. 最小可能值:b6fcb01a367ee22a270e9208dc474d89.png最小可能值因此, 对于特定的θ值,针在垂线上的概率是:1747f47bf2267460bc324fc4c7350e9b.png针与垂线相交的概率公式这个概率公式局限于特定θ值,在本实验中,θ的范围是0到pi/2。所以,我们需要对所有的θ值做一个积分,得到投针相交的实际概率.2ca2813856796b9bb3d54b53d6b63230.png对所有θ值积分的投针相交概率公式d833bb8698d819cb9782a1e0e8ac3f72.pngPI的估计值

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

接下来,我们要用上面的公式来进行实验求得PI值.734be230d83b3354a97fa718baae8966.png求PI值现在,因为我们已经知道了l和d的值,所以只要求得了P的值,我们就可以推知PI的值。而要得到概率P,必须要知道相交针数和总针数, 这里的总针数是已知的.下图是计算相交针数的直观图解.e3dc083a4c0d29e7a98a41e892701a4a.png可视化表示如何计算针的数量

Python 实现:

  1. Import 所需的库:
bc550f7fb5cb82302a2a5f6dcd0749df.png导入所需库2. Main 函数:f231a37319532e376751984ddf80ce3a.png用蒙特卡洛方法模拟蒲丰投针3. 调用main函数:d1633f63ac2e73f2a0362aa737c89a70.png调用main函数模拟蒲丰投针4. 输出:d671eae2abfc190618abfa4029e740cf.png使用蒙特卡洛方法模拟100次投针的数据如上图所示,经过100次的模拟,蒙特卡洛法就能得出一个非常接近PI的值。90ceed827f3f2e06373968e986156f2e.png

3548e080f58937aee07f36376e3ac2bf.png

为什么赌场总是赚的?

赌场是怎么赚钱的?诀窍很简单--“你玩得越多,他们赚的就越多。” 让我们通过一个简单的蒙特卡罗模拟示例来看看这是如何工作的。考虑一个假想的游戏,玩家必须从一袋筹码中选择一个筹码。

规则:

  1. 袋子里有数字从1到100的筹码。
  2. 用户可以押注于偶数或奇数筹码。
  3. 在这个游戏中,10和11是特殊的数字。如果我们赌偶数,那么10就算奇数,如果我们赌赔率,那么11就算偶数。
  4. 如果我们赌偶数,我们得了10,那么我们就输了。
  5. 如果我们赌的是奇数,我们得了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%。因此,我们可以肯定,与轮盘赌相比,您在假想的游戏中获胜的机会更大。

d96238e761899a9e6d5745815fd9db0b.png

Python 实现

Import所需的库:0e3e171683ba58d47e418c3e1d998130.png导入赌场模拟所需的库2. 玩家下注:f09de11f99ce716a783526513d56d276.png在下注奇数或偶数3. Main 函数:bcc8dd26368a61d861713088c2e44f5b.png使用蒙特卡洛方法模拟赌场行为4. 最终输出:92715a368938c3dd6d1070a6d3630f0b.png计算并展示计算结果5. 模拟1000次试试:a043f6447b7effae0b0bf56420a98111.png模拟1000次6. 下注数 = 570d5c5c12c694bfe14bace1d13a2bf91.png图43:  下注5次时的结果可视化  .7.  下注数 = 10:39e48cbbba236b6d1e9ca2202ba27035.png图44: 下注10次时的结果可视化.8.  下注数 = 1000:5206b6e2ce71ef03eda98eb9ef2ddae3.png下注1000次时的结果可视化  9.  下注数 = 5000:57fdf90ab18de6438c3e487eab763eb8.png下注5000次时的结果可视化  10.  下注数 = 10000:7e8147df2863eb0b76c7650d1737c119.png下注10000次时的结果可视化从上面的实验中,我们可以看到,如果玩家在赌博中下注较少,那么有得赚的机会就比较大。有时候实验会得到负数,这意味着玩家输得倾家荡产负债累累,而不是单车变路虎.请注意, 这些比例源于为促进理解的非真实场景,认不赌为赢.

e36899adfce141ee75b01e67176652ca.png

结论

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

aaf2d1e930989d7070ba1a832e9d7c9d.png

e83fd0b92e55cd4cf3ee84d87bad628a.gif

AI研习社是AI学术青年和开发者社区,为大家提供一个顶会资讯、论文解读、数据竞赛、求职内推等的技术交流阵地,欢迎登陆www.yanxishe.com加入我们吧~

投稿、转载、媒介合作联系微信号 | bajiaojiao-sz

商务合作联系微信号 | LJ18825253481

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

琥珀项目:Java的未来揭晓

如果一切按计划进行(我们正在研究Jigsaw项目),那么Java 9将在不到100天的时间内启动。 您可以在此处加入倒计时以发布它。 它将包含一长串新功能和升级功能,其中一些我们迫不及待想要看到实际应用。 但是,有些功能还没…

安装saltstack

https://www.cnblogs.com/agnewee/p/6487262.html 官方资料:https://docs.saltstack.com/en/latest/ref/configuration/index.html 官网资料:https://repo.saltstack.com/#rhel yum install https://repo.saltstack.com/py3/redhat/salt-py3-repo-latest…

python中for和while区别_Python学习第九篇——while和for的区别

1 pets [dog,cat,dog,goldfish,cat,rabbit,cat]2 print(pets)3 for pet inpets:4 print(pet)5 #------------------------------------------ 6 pets [dog,cat,dog,goldfish,cat,rabbit,cat]7 print(pets)8 while pet inpets:9 print(pet) 上述代码都想打印列表中的所有元素&…

java 11:数组作为函数参数,数组做为函数返回值

1 数组作为参数 我们可以将数组作为参数,传入到函数中,其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数; 又如, [java] view plaincopypublic class ArrayPar { public static void p…

C++ 指针基本概念

Ⅰ.内存和地址 我们已经很熟悉一些基本的存储单位了,比如一个bit(位)用存储0或者1.也可以把几个bit合起来表示更大的数字,比如一个byte(字节)就包含了8个bit.这些都是很基础很简单的东西.然后我们可以把计算机的内存想象成一个字节数组,内存中的每一个地址表示一个字节. 每个字…

Java 7:使用NIO.2进行文件过滤–第2部分

大家好。 这是使用NIO.2系列进行文件过滤的第2部分。 对于那些尚未阅读第1部分的人 ,这里有个回顾。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以执行与java.io相同的操作,以及许多出色的功能,例如&a…

机器人教育发展_得于人工智能发展,机器人教育低龄化越来越普及

近两年,各种看得到看不到的渠道都在推荐学机器人少儿编程,虽有利益使然,不过机器人少儿编程也确实算得上是通往世界名校大门的快速通道。相信很多家长也同样能感到,最近这股风刮得实在是太大,以至于周围的家长们都开始…

C#相对路径

1、 根目录 .\\ 或者直接给出文件名称,是找根目录的路径。 如:path "gs.mdb" 与 path ".\\gs.mdb"是一个意思。 2、 根目录的上级目录, 在C#中是指定到bin文件夹里面 ..\\ 应用程序的根目录的上两级 3、指定到根目录上面的三级目录…

java finalize方法的使用

《JAVA编程思想》: Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4).垃圾回收和finalize()都是靠不住的,只要…

C++ 运算符优先级

优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号(表达式)/函数名(形参表) .成员选择(对象)对象.成员名 ->成员选择(指针)对象指针->成员名 2-负号运算符-表…

另一个拼图观点

在过去的几周中,围绕即将发布的Java 9及其最著名的功能:Java平台模块系统JPMS展开了激烈的辩论。 –以项目拼图Jigsaw的名称而闻名。 模块系统以正式规范过程的形式引入Java生态系统 – JSR –需要由专家组以最终形式批准。 在该专家组的其他成员中&am…

Cookie中不能有空格_前端小贴士 -- 全面了解Cookie

一、Cookie的出现浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web应用程序的实现。针对上述的问题,网景公司的程序员创造了Cookie。…

线程面试题

1.在使用线程时,为什么不直接调用run()方法而是调用了start(): 直接调用run()方法,不存在线程的启动,属于调用实例方法,只有一条执行路径,不存在多线程并行交替执行了。调用start()方法属于启动线程,将自动…

Java IO - Reader

前言 JavaIO一共包括两种,一种是stream,一种是reader/writer,每种又包括in/out,所以一共是四种包。Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串&…

python程序设计语言的执行方式_编程语言用Python执行程序的4种方式

在编写代码中,经常会遇到在 Python程序中打开外部程序的需求,那么在Python里如何打开外部程序呢?今天我们来介绍四种不同的方式,供大家参考收藏。 使用 os.system() os.system(command)是最简单的一种方式,我们import os模块&…

leetcode 994.腐烂的橘子

题目: 在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会…

运行时异常和检查性异常区别

Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿…

VS2015配置freegult

与vs配置opencv类似 1.首先先找到自己系统里OpenGL相关.h.lib .dll的位置 一般系统里已自带,只要去找到就好,我的位置: gl.h C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl OpenGL32.Lib GlU32.Lib C:\Program Files\Microsoft…

java 死锁的检测与修复_调查死锁–第4部分:修复代码

java 死锁的检测与修复在这个简短的博客系列的最后BadTransferOperation中,我一直在讨论分析死锁,我将修复BadTransferOperation代码。 如果您已经看过本系列的其他博客 ,那么您会知道,为了达到这一点,我创建了死锁演示…

python下载url_三种Python下载url并保存文件的代码详解

利用程序自己编写下载文件挺有意思的。 Python中最流行的方法就是通过Http利用urllib或者urllib2模块。 当然你也可以利用ftplib从ftp站点下载文件。此外Python还提供了另外一种方法requests。 来看看三种方法是如何来下载zip文件的: import urllib import urllib2 …