导语

蒙特卡洛算法是一大类随机算法,通过随机样本来估算真实值。 本节课我们使用几个例子来讲解蒙特卡洛算法。

通过均匀抽样计算π\piπ

假如我们不知道π\piπ值,现在我们来估算π\piπ值,假设我们有随机数生成器,那么我们能否借助它来估算π\piπ值呢。接下来,我们使用蒙特卡洛方法来估算π\piπ值。

假设我们有两个随机数生成器,它们都可以均匀的从-1到+1产生随机数,我们把生成的数字一个作为x,一个作为y。于是每次就生成了平面坐标系上的一个点(x,y)。所有点都会落在蓝色正方形区域内,由于x,y都是均匀分布,所以正方形内所有区域内点都有相同的概率密度。正方形内包含绿色的圆,半径为1,圆心在原点处。

随机点可能落在圆内或者圆外。我们可以思考一下,点落在圆内的概率有多大?显然,概率值应该为圆的面积除以正方形的面积。即P=π/4P=\pi/4P=π/4。

假设我们从正方形区域内均匀抽样n个点,那么落在圆内的点个数的期望是PnPnPn。当然,这只是数学期望,而非一定会发生。

还有一个问题就是给定一个点,如何确定这个点是在圆内还是圆外。其实很容易判断,用一下圆的方程即可。即只需判断该点是否满足
x2+y2≤1x^2+y^2 \le 1 x2+y2≤1
即可。

假设我们均匀抽样n组点,其中m个落在圆内。假如n非常大, 那么我们可以近似得到
m≈πn4m \approx \frac{\pi n}{4} m≈4πn​
对该式做变换,将n移到分母上。我们可以得到:
π≈n4m\pi \approx \frac{n}{4m} π≈4mn​


大数定律保证了蒙特卡洛的正确性,当样本数量n趋于无穷时,4m/n就会趋于π\piπ。其实,还可以通过概率不等式来计算真实值和估计误差的上界。用伯恩施坦不等式可以证明,估计误差的上界反比于n\sqrt{n}n​ 。这说明样本数量越大,蒙特卡洛近似就越准确。但这个收敛率并不快,样本多10000倍,精度才可以提高100倍。

有了以上求π\piπ的公式,我们就可以编程计算,伪代码 如下图:

布丰投针实验

布丰投针实验也是用来计算π\piπ值的,好处是不需要借助计算机,人就可以完成。布丰投针实验的内容如下:拿一张纸,画出若干等距的平行线,随机撒一把针,数一下一共有多少跟针与平行线相交。通过这个数量,我们就可以计算出π\piπ值。

其计算公式如下:

证明过程略。

估计阴影部分面积

如下图所示,我们需要计算阴影部分面积。

如图所示,阴影部分的点必须满足两个条件:

  1. 必须在圆内
  2. 必须在扇形外
    所以其满足方程如下:

    我们在正方形区域内随机采样点。我们做n次实验,其中m次落在阴影内。那么可以估计得到阴影部分的面积为:

    其伪代码如下:

近似求积分

近似求积分是蒙特卡洛最重要的应用之一,应用广泛。

一元函数的定积分

我们首先来看一个简单的问题,使用蒙特卡洛方法求一元函数的定积分。一元函数的自变量x是一个标量。其具体计算方法如下:

  1. 从区间[a, b]上均匀抽样n个点x1,……,xn
  2. 对这n个点的函数值求平均再乘上区间的长度b-a,将结果记为Qn
  3. 函数在区间上的定积分I约等于Qn

    同样,大数定律可以保证蒙特卡洛的正确性。当样本数量n趋于无穷时,Qn的值趋近于I。

多元函数的定积分

当自变量x是一组变量时,即为多元函数的定积分。其计算过程如下:

  1. 首先是从积分空间Ω\OmegaΩ中随机均匀的抽样得到x1,⋯,xnx_1,\cdots,x_nx1​,⋯,xn​(都是向量)
  2. 计算体积V=∫ΩdxV=\int_{\Omega}dxV=∫Ω​dx
  3. 计算Qn=V⋅1n∑i=1nf(xi)Q_n = V\cdot\frac{1}{n}\sum_{i=1}^nf(x_i)Qn​=V⋅n1​∑i=1n​f(xi​)
  4. 函数在区间上的定积分I约等于Qn

注意,在第二步求体积时这个定积分也可能很困难,我们也要尽量确保Ω\OmegaΩ的形状简单以便于计算。


下面我们来举一个例子。

我们同样可以使用计算定积分的方式估计圆的面积π\piπ。同样也是在Ω\OmegaΩ上均匀采样得到一系列点,然后计算Ω\OmegaΩ的面积。最后计算QnQ_nQn​作为最终定积分结果的估计值。这种方法和我们最开始从概率角度出发计算π\piπ值不谋而合。

使用蒙特卡洛方法近似求期望

我们定义X为一个d维的随机变量,p(x)是其概率密度函数。令f(x)代表任意一个d维的多元函数。那么,我们可以得到f(X)的期望就是f(x)乘以p(x)在整个d维空间上求定积分:

直接求这个定积分不容易,尤其是x是高维向量时。通常,可以用蒙特卡洛近似求期望。具体是这三步:

  1. 首先是随机抽样,这里不是均匀抽样而是根据概率密度函数p(x)抽样
  2. 然后将抽样得到的样本带入函数f计算f(xi)f(x_i)f(xi​),求这n个函数值的平均,记作Qn
  3. 最后是返回Qn用作对样本期望的估计。

参考

  1. 蒙特卡洛 Monte Carlo, https://www.youtube.com/watch?v=XRGquU0ZJok&list=PLvOO0btloRns2Wnn2MPQ-Z8viHoBfxGGJ&index=1&ab_channel=ShusenWang

蒙特卡洛算法学习笔记相关推荐

  1. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  2. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  3. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  4. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  5. 算法学习笔记:对指定金额计算最少钞票数

    算法学习笔记:对指定金额计算最少钞票数 一.引出问题 财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少.例如,某职工工资为3 ...

  6. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记

    关于MATLAB的数学建模算法学习笔记 目录 线性规划中应用: (3) 非线性规划: (3) 指派问题;投资问题:(0-1问题) (3) 1)应用fmincon命令语句 (3) 2)应用指令函数:bi ...

  7. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

  8. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  9. l2-004 这是二叉搜索树吗?_算法学习笔记(45): 二叉搜索树

    二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,在理想情况下,它可以以 的复杂度完成一系列修改和查询,包括: 插入一个数 删除一个数 查询某数的排名(排名定义为比该数 ...

最新文章

  1. html路由怎样做div,路由传参练习.html
  2. async function_Electron IPC 通信如何使用 async/await 调用?
  3. ExtJs之Field.Trigger和Field.Spinner
  4. 小程序 按需_小程序想要留住用户需哪些举措?
  5. 服务器证书安装配置指南(IIS7)
  6. oracle 9.2.0.1下载,Oracle 9i 从9.2.0.1升级到 9.2.0.6 步骤
  7. KendoUI--Grid api 出现的问题
  8. Spring MVC异常处理详解 ExceptionHandler good
  9. UnityShader8:编写Shader时需要注意的细节和可能需要的意外/BUG
  10. 史上最全的“挑战杯”全国大学生课外学术科技作品竞赛 互联网+商业计划书 创青春商业计划书 PPT模板以及编写技巧 国家级获奖作品链接
  11. 为什么小角度的弧度值可以近似等于正切值或者正弦值?
  12. [Erlang 0075] Bad value on output port 'tcp_inet'
  13. 表格与合并之Excel如何快速合并多个表格数据
  14. python文本txt词频统计_python实例:三国演义TXT文本词频分析
  15. 解:一阶齐次或非齐次线性微分方程-详细推导
  16. 英语六级高频词汇速记 + 2020-7听力 Day09
  17. 如何成为一名架构师,架构师成长之路
  18. 2022年应届大学毕业生就业分析报告
  19. java 动态代理实现原理
  20. 银行排队叫号系统的模拟

热门文章

  1. 【LeetCode-中等】53. 最大子数组和(详解)
  2. android ormlite框架,ORMLite框架 的使用方法—给你的数据库操作插上翅膀
  3. 浅谈2022梧桐杯乡村、城市赛道双TOP1——从数据分析的角度
  4. centos7/6.9 docker-ce-17/1.7.1使用证书登陆(openssl tls)
  5. Egret白鹭引擎开发微信小游戏之保存图片到相册
  6. Python学习笔记:第十一站 全民来找茬
  7. Python3.7总结字符串的print和拼接
  8. Vue3中使用Aliplayer
  9. jzoj 4240.【五校联考5day2】游行 主席树优化连边+支配树
  10. 金九银十,跳槽找工作的几点良心建议