一文详解蒙特卡洛(Monte Carlo)法及其应用

一文详解蒙特卡洛(Monte Carlo)法及其应用我的机器学习教程「美团」算法工程师带你入门机器学习已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~概述…

大家好,又见面了,我是你们的朋友全栈君。

任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

一文详解蒙特卡洛(Monte Carlo)法及其应用

 

概述

蒙特卡罗方法是一种计算方法。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。
 

它非常强大和灵活,又相当简单易懂,很容易实现。对于许多问题来说,它往往是最简单的计算方法,有时甚至是唯一可行的方法。它诞生于上个世纪40年代美国的”曼哈顿计划”,名字来源于赌城蒙特卡罗,象征概率。

 

π的计算

第一个例子是,如何用蒙特卡罗方法计算圆周率π。正方形内部有一个相切的圆,它们的面积之比是π/4。

一文详解蒙特卡洛(Monte Carlo)法及其应用

一文详解蒙特卡洛(Monte Carlo)法及其应用

现在,在这个正方形内部,随机产生10000个点(即10000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部。

一文详解蒙特卡洛(Monte Carlo)法及其应用
如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。通过R语言脚本随机模拟30000个点,π的估算值与真实值相差0.07%。
 

无意识统计学家法则(Law of the unconscious statistician)

 

这是本文后续会用到的一个定理。作为一个预备知识,我们首先来介绍一下它。先来看一下维基百科上给出的解释。 
In probability theory and statistics, the law of the unconscious statistician (sometimes abbreviated LOTUS) is a theorem used to calculate the 期望值 of a function g(X) of a 随机变量 X when one knows the probability distribution of X but one does not explicitly know the distribution of g(X). The form of the law can depend on the form in which one states the probability distribution of the 随机变量 X.

  • If it is a discrete distribution and one knows its PMF function ƒX (but not ƒg(X)), then the 期望值 of g(X) is
    E[g(X)]=∑xg(x)fX(x)

    where the sum is over all possible values x of X.

  • If it is a continuous distribution and one knows its PDF function ƒX (but not ƒg(X)), then the 期望值 of g(X) is
    E[g(X)]=∫∞−∞g(x)fX(x)dx

LOTUS到底表达了一件什么事呢?它的意思是:已知随机变量X的概率分布,但不知道g(X)的分布,此时用LOTUS公式能计算出函数g(X)的数学期望。LOTUS的公式如下:

  • X是离散分布时
    E[g(X)]=∑xg(x)fX(x)
  • X是连续分布时
    E[g(X)]=∫∞−∞g(x)fX(x)dx

其实就是在计算期望时,用已知的X的PDF(或PMF)代替未知的g(X)的PDF(或PMF)。


蒙特卡洛求定积分(一):投点法

这个方法也常常被用来求π值。现在我们用它来求函数的定积分。如下图所示,有一个函数f(x),若要求它从a到b的定积分,其实就是求曲线下方的面积。这时我们可以用一个比较容易算得面积的矩型罩在函数的积分区间上(假设其面积为Area)。然后随机地向这个矩形框里面投点,其中落在函数f(x)下方的点为绿色,其它点为红色。然后统计绿色点的数量占所有点(红色+绿色)数量的比例为r,那么就可以据此估算出函数f(x)从a到b的定积分为Area×r。

 

一文详解蒙特卡洛(Monte Carlo)法及其应用

 

注意由蒙特卡洛法得出的值并不是一个精确之,而是一个近似值。而且当投点的数量越来越大时,这个近似值也越接近真实值。


蒙特卡洛求定积分(二):期望法

下面我们来重点介绍一下利用蒙特卡洛法求定积分的第二种方法——期望法,有时也成为平均值法。

任取一组相互独立、同分布的随机变量{Xi},Xi在[a,b]上服从分布律fX,也就是说fX是随机变量X的PDF(或PMF),令g∗(x)=g(x)fX(x),则g∗(Xi)也是一组独立同分布的随机变量,而且(因为g∗(x)是关于x的函数,所以根据LOTUS可得) 

E[g∗(Xi)]=∫bag∗(x)fX(x)dx=∫bag(x)dx=I

由强大数定理 

 

Pr(limN→∞1N∑i=1Ng∗(Xi)=I)=1

若选 

 

 

I¯=1N∑i=1Ng∗(Xi)

则I¯依概率1收敛到I。平均值法就用I¯作为I的近似值。

 

 

假设要计算的积分有如下形式

I=∫bag(x)dx

其中被积函数g(x)在区间[a,b]内可积。任意选择一个有简便办法可以进行抽样的概率密度函数fX(x),使其满足下列条件:

 

  1. 当g(x)≠0时,fX(x)≠0(a≤x≤b)
  2. ∫bafX(x)dx=1

如果记 

g∗(x)=⎧⎩⎨⎪⎪g(x)fX(x),0,fX(x)≠0fX(x)=0

那么原积分式可以写成 

 

I=∫bag∗(x)fX(x)dx

因而求积分的步骤是:

 

 

  1. 产生服从分布律fX的随机变量Xi (i=1,2,⋯,N);
  2. 计算均值
    I¯=1N∑i=1Ng∗(Xi)

    并用它作为I的近似值,即I≈I¯。

如果a,b为有限值,那么fX可取作为均匀分布: 

fX(x)=⎧⎩⎨1b−a,0,a≤x≤botherwise

此时原来的积分式变为 

 

I=(b−a)∫bag(x)1b−adx

具体步骤如下:

 

 

  1. 产生[a,b]上的均匀分布随机变量Xi (i=1,2,⋯,N);
  2. 计算均值
    I¯=b−aN∑i=1Ng(Xi)

    并用它作为I的近似值,即I≈I¯。


平均值法的直观解释

下面是来自参考文献【1】的一个例子。注意积分的几何意义就是[a,b]区间内曲线下方的面积。 

一文详解蒙特卡洛(Monte Carlo)法及其应用

当我们在[a,b]之间随机取一点x时,它对应的函数值就是f(x),然后变可以用f(x)×(b−a)来粗略估计曲线下方的面积(也就是积分),当然这种估计(或近似)是非常粗略的。 

 

一文详解蒙特卡洛(Monte Carlo)法及其应用

于是我们想到在[a,b]之间随机取一系列点xi时(xi满足均匀分布),然后把估算出来的面积取平均来作为积分估计的一个更好的近似值。可以想象,如果这样的采样点越来越多,那么对于这个积分的估计也就越来越接近。 

 

一文详解蒙特卡洛(Monte Carlo)法及其应用

按照上面这个思路,我们得到积分公式为 

 

I¯=(b−a)1N∑i=0N−1f(Xi)=1N∑i=0N−1f(Xi)1b−a

注意其中的1b−a就是均匀分布的PMF。这跟我们之前推导出来的蒙特卡洛积分公式是一致的。

 

参考文献

【1】http://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/monte-carlo-methods-in-practice/monte-carlo-integration

 

>>>关于作者

CSDN 博客专家,2019-CSDN百大博主,计算机(机器学习方向)博士在读,业余Kaggle选手,有过美团、腾讯算法工程师经历,目前就职于Amazon AI lab。喜爱分享和知识整合。

关注微信公众号,点击“学习资料”菜单即可获取算法、编程资源以及教学视频,还有免费SSR节点相送哦。其他平台(微信/知乎/B站),欢迎关注同名公众号「图灵的猫」~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142514.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月23日 下午4:20
下一篇 2022年5月23日 下午4:20


相关推荐

  • 线程间通信的几种方法_c语言线程函数

    线程间通信的几种方法_c语言线程函数线程间如何通信/同步?此前小编给大家介绍了进程间通信的方法,于是一些伙伴又好奇线程间的通信及同步方法,没关系,下面小编就继续给大家科普下线程间通信及同步的方法。线程间通信及同步方法介绍:一、线程间的通信方式1、使用全局变量主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile。2、使用消息实现通信在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息…

    2022年10月6日
    4
  • 淘宝店卖家欢迎语大全,让你的店铺更有温度!💌

    淘宝店卖家欢迎语大全,让你的店铺更有温度!💌

    2026年3月15日
    2
  • object转string的四种方式

    object转string的四种方式通常 object 到 string 有四种方式 假设有 objectobj obj ToString Convert ToString string obj objasstring 他们都能将 object 对象转换成 string 对象 我就讲讲他们的异同以及在实际中应该使用哪个 前两个方法通常是由别的对象得到 string 对象 它们间的区别只表现在要转换的对象为 null 时

    2025年10月30日
    6
  • 部门年终会议如何开_关于召开年度工作总结会议的通知

    部门年终会议如何开_关于召开年度工作总结会议的通知前言:最近有同学问我,部门年终总结会议要不要开,是否有这个必要?那我就说说我的观点,关注我的同学都知道我上月初刚参加完团队的年终总结,我想我应该很有发言权!部门年终总结会议有必要开吗?一、这是否有你的心理?二、那到底要不要开?三、个人感慨!一、这是否有你的心理?每年的年终,不仅个人要写年终总结,团队的leader也要复盘团队一年的工作情况以及来年的展望。很多人都会认为这个无非就是走个形式,给上面的领导看,基本没有任何意义,大家就无非聚集在一起,开个无聊的会,讲完后大家屁股一抬,工作的事全部重来!二

    2026年4月13日
    4
  • Spring事务传播机制详解

    Spring事务传播机制详解前言 Spring 的事务 也就是数据库的事务操作 符合 ACID 标准 也具有标准的事务隔离级别 但是 Spring 事务有自己的特点 也就是事务传播机制 所谓事务传播机制 也就是在事务在多个方法的调用中是如何传递的 是重新创建事务还是使用父方法的事务 父方法的回滚对子方法的事务是否有影响 这些都是可以通过事务传播机制来决定的 本文就测试一下这些事务传播机制

    2026年3月20日
    2
  • JS中click事件

    JS中click事件今天在写Ajax请求代码时,js代码遇到了一点问题。最后还专门将一部分代码拷贝到webStorm里面测试,花了好久,发现是个坑。先贴一段代码:第一个按钮的点击事件没有任何反应。第二个按钮就会弹出“你好”。原因:这是因为我使用了click这个作为函数的名字,我在这几类中查询了一下,却没有发现click的踪影,而使用click作为函数名,浏览器既不报错,也不提示,真的很坑啊!类似还有open和clos…

    2022年6月13日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号