一文详解蒙特卡洛(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql时区设置_oracle数据库时区设置

    mysql时区设置_oracle数据库时区设置方法一:通过mysql命令行模式下动态修改1.1查看mysql当前时间,当前时区>selectcurtime(); #或selectnow()也可以+———–+|curtime()|+———–+|15:18:10|+———–+>showvariableslike"%time_zone%";+————–…

    2025年8月11日
    3
  • 概率/随机数算法

    概率/随机数算法包含主要的概率/随机数问题相关算法

    2022年7月26日
    12
  • Qt-QCustomplot画静态、动态曲线教程图解

    Qt-QCustomplot画静态、动态曲线教程图解1、QCustomPlot介绍QCustomPlot是一个小型的Qt画图标类,支持绘制静态曲线、动态曲线、多重坐标曲线,柱状图,蜡烛图等。只需要在项目中加入头文件qcustomplot.h和qcustomplot.cpp文件,然后使一个widget提升为QCustomPlot类,即可使用。QCustomPlot官网:http://www.qcustomplot.com/…

    2022年10月17日
    2
  • 2021sublime激活码【2021最新】

    (2021sublime激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~9071407CR5-eyJsaWNlbnNlSWQiOi…

    2022年3月22日
    51
  • django模型数据类型_多属性决策模型

    django模型数据类型_多属性决策模型模型中常用字段字段说明AutoField一般不需要使用这个类型,自增长类型,数据表的字段类型为整数,长度为11位BigAutoField自增长类型,数据表的字段类型为bigint,长度为2

    2022年7月29日
    9
  • APP弱网测试[通俗易懂]

    APP弱网测试[通俗易懂]APP弱网测试 一、网络测试的一般流程step1:首先要考虑网络正常的情况① 各个模块的功能正常可用② 页面元素/数据显示正常step2:其次要考虑无网络的情况① APP各个功能在无网络情况下是否可用② APP各个页面之间切换是否正常③ 发送网络请求时是否会导致闪退、卡死等异常情况④ APP各个页面是否显示完整美观,未刷新的页…

    2022年4月19日
    35

发表回复

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

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