蒙特卡洛方法及其求积分应用

article/2025/8/21 18:17:19


本文发自:http://www.haopeng233.top/2018/06/16/math-probability-MC/

欢迎大家访问:)

前言

最初听到蒙特卡洛方法(Monte Carlo,下文用MC代替)是在本科的工程经济学课堂上,当时汪帅(汪洋老师是个特别有人格魅力的老师,同学们都被他的折服,他还是我答辩的三位老师之一:))提到了了用MC解决一个现金流的估值然后决策的问题。

这学期的CV中又提到粒子群滤波做运动跟踪的任务,其中涉及到了MC,重要性采样(IS)等,MC方法应用广泛,RL中也用到了它,还有一些微积分问题也可以转化为MC方法可解决的问题。

本文主要介绍MC方法以及它是如何用到求积分问题上。

MC方法

学习一个方法,我们先要知道输入是什么,输出是什么,这个方法做了什么,完成了什么任务,知道这些后再学习具体流程才会有更好的理解。

那么MC方法解决什么问题呢,它的核心在于求一个随机变量的期望问题,如下所示,离散或者连续分布都可以,但是这个分布的概率分布$p(x)$必须是已知的。MC方法说的是你可以按已知的概率分布采样,只要你采样足够多,那么就可以得到这个随机变量的期望。

$$ E(x) = \int xp(x)dx$$

$$ E(x) = x_1p(x_1) + x_2p(x_2) + ... + x_np(x_n)$$

$$ E(x) = \frac{1}{N} \sum_{i=1}^N{x_i}$$

对于离散随机变量,如果知道它的分布,直接可以用公式求取期望,不一定需要用到MC,但用MC也work。尤其是伯努利分布时,如果概率$p$未知还可以通过求期望估计出$p$,最简单的例子就是通过抛硬币实验得到正面的概率为0.5,此外撒点求面积也是这个思路。对于连续型随机变量,即使你知道概率密度,但也存在着不好积分问题,这时就可以通过MC方法求期望。

采样方法

那这样连续随机变量求期望的问题是不是就已经解决了?当然不是,还有一个问题,我们如何获得服从特定分布的采样?一般来说有以下方法。

逆采样

也就是随机数发生器。对任意随机变量$s$的概率密度函数积分可以得到累计分布函数(CDF),CDF横轴是随机变量取值范围,纵轴是[0,1]。然后我们交换横纵坐标轴,可以得到下面的图,计算机可以产生[0,1]的均匀分布的样本点,然后做逆变换就可以得到服从随机变量$x$分布的采样。

这是一种处理随机变量的技巧,图像处理中的直方图均衡化用的也是用的这个技巧。对于任给的随机变量$s$,都可以做一种变换$T^{-1}(s)$,使新得到的随机变量$r$是[0,1]区间上的均匀分布。以上具体推导与证明可以参考《数字图像处理(第二版)》72页。

重要性采样

逆采样的方法就是构造随机数发生器,但这个过程中要求$p(x)$的积分。但是我们本来就是因为积分难求才用采样的方法来求期望,因此逆采样的方法有很大的局限性,因此引申出重要性采样的方法。

公式如下图所示,这里$f(x)$可以先看做是$x$,稍后我们会将其扩展到$x$的任意函数,原理见后面的LOTUS定理。$p(x)$为待求随机变量$x$的概率密度函数,$q(x)$为我们已知的一个概率密度函数,可以是均匀分布等,它的CDF很容易得到,这样就可以将按照$p(x)$采样的问题转换为按照$q(x)$采样,只需要对采样出来的随机变量乘以$\frac{p(x)}{q(x)}$就可以了,这样多次采样我们就可以求出原问题的期望。这里$\frac{p(x)}{q(x)}$称为重要性权重。

上述两种方法只是很基础的采样方法,此外还有拒绝采样,MCMC等。

MC求积分

观察下式,用MC方法求随机变量$x$的期望的过程相当于求了$g(x) = xp(x)$这个函数的积分,积分区间为$x$的取值区间。因此在求$g(x)$的定积分时,就可以构造随机变量$x$与分布$p(x)$,用MC方法求积分问题。

$$ \sum_{i=1}^N{x_i} = E(x) = \int xp(x) = \int xp(x)dx = \int g(x)dx$$

但是上述函数形式为$x$,而我们实际的积分函数可以是$x$的任意函数$g(x)$,如果随机变量换成函数值,我们又不知道函数值$g(x)$的分布。那这个事情如何来做?已经有人想好了,参考无意识统计学家法则(Law of the unconscious statistician)。

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

  • X是离散分布时

$$E[g(X)]=∑_xg(x)f_X(x)$$

  • X是连续分布时

$$E[g(X)]=∫_{−∞}^∞g(x)fX(x)dx$$

其实就是在计算期望时,用已知的$X$的PDF(或PMF)代替未知的$g(X)$的PDF(或PMF)。这说明我们在求$g(x)$的期望时,可以按照$x$的分布来采样,比较直观的理解就是它可以融合对应同一个$g(x)$的概率值。以离散随机变量为例,假设$g(x)= x^2 $,$x ={1,-1}$,$p(x = 1) = 0.5$,$p(x = -1) = 0.5$,$g(x)= {1}$,我们可以在不知道$g(x)$分布的前提下,直接利用$x$的分布计算出$g(x)$的期望。虽然会多进行了一次运算,但最后结果是一致的。其实就是这样做会将对应的概率值融合,直观理解是这样,同时LOTUS也告诉我们这样做是对的。

$$E[g(X)] =x_1^2p(x = 1) + x_2^2p(x = -1) = 1 × 0.5 + 1 × 0.5 = 1$$

因此对于任意函数$g(x)$的积分问题,我们都可以构造随机变量$h(x) = \frac{g(x)}{f(x)} $,$f(x) 服从 U(a,b)$,然后按照$f(x)$对$h(x)$采样,其期望值就是函数$g(x)$的积分。

需要注意的是MC方法最本质的就是要解决随机变量的期望问题,而不是解决积分问题,积分问题只是MC方法的一个应用,我刚开始理解的不对,以至于看到期望的积分表达式还想把他变成积分问题来做,这样其实多此一举,但是如果这样做就是在做重要性采样。

对于真正的积分问题(不是随机变量求期望问题),一定不需要做重要性采样,直接均匀分布就ok,因为它本身就不是随机变量,我们只用构造一个简单的随机变量(比如均匀分布)就可以了。重要性采样是对针对随机变量的采样问题的。

MC如何解释撒点法求面积

问题如下,就是如何求得红色圆形的面积,当然我们都知道可以用撒点法来做。但是撒点法求如下圆的面积的理论依据是什么,用MC方法解释的话,求得的期望值是面积,但随机变量是什么?这个问题的来源是我看了一篇博客,他认为需要用重要性采样的方法来解释撒点法算面积。

我首先讲一下我对这个问题的理解,我们做这个事情的先验知识为如果两个维度都服从均匀分布并随机扔一个点,那么点落在圆内的概率$(p)$=圆的面积($S_c$)/正方形的面积($S_s$),因此构造离散随机变量$X$

$$ X = \begin{cases} 0 & 点在圆外 \\ S_s & 点在圆内 \end{cases} $$

$X(0) = 1 - p$,  $X(1) = p$,   $E(x) = S_sp$, 那通过MC的方法就可以得到随机变量$X$的期望$E(x) = S_sp$,而$S_sp = S_c$,那么就能得到$S_c$,大功告成,完全不需要重要性采样解释。

同时我按照上述博客中的思路,从重要性采样的角度分析了一下,感觉只是为了解释而解释。如果用重要性采样解释的的话,原始问题如左图形式,随机变量也就是圆的面积$S_c$不知道是什么,$g(x)$是他的分布,但也不知道具体形式。用重要性采样的方法转化为右图形式,$p(x)$是均匀分布,重要性权重$ \frac{g(x)}{p(x)}$是指示函数,落在圆内为1,圆外为0,认为$S_c$是指示函数$ \frac{g(x)}{p(x)}$的函数,指示函数为0,$S_c = 0$,指示函数为1,$S_c = S_s$,因此整个采样过程就被套在了重要性采样的框架下,但是感觉很牵强,为了解释而解释。其实在我的解释中随机变量$X$就充当了$ S_c \frac{g(x)}{f(x)}$这部分的角色。

总结

  • MC方法能做什么,已知随机变量的分布,用这个分布采样求随机变量的期望。

  • 由于LOTUS的保证,MC方法也可以求随机变量函数$f(x)$的期望,按照$x$的分布采样就可以,可以从融合相同取值的概率可以获得直观理解。对$x$采样就可以获得$f(x)$分布的采样。

  • 原始采样无法通过逆采样获得时,可通过重要性采样曲线求期望。

  • 积分问题可通过构造随机变量转化为求随机变量的期望问题,进而用MC方法做,一般转化为均匀分布的随机变量。

参考

  • 重要性采样:https://blog.csdn.net/ArtistA/article/details/51570878

  • 采样方法:https://blog.csdn.net/Dark_Scope/article/details/70992266

  • MC求积分:https://blog.csdn.net/baimafujinji/article/details/53869358


http://chatgpt.dhexx.cn/article/D7tOTH2G.shtml

相关文章

蒙特卡洛法求积分

问题一:我们如何用蒙特卡洛方法求积分?问题二:如何近似求一个随机变量的数学期望?问题三:估计的误差是多少?问题四:如何从理论上对蒙特卡洛估计做分析?结论 import numpy as np impo…

蒙特卡洛方法求定积分

用蒙特卡洛方法计算定积分 1.原理 计算定积分 利用蒙特卡洛计算方法,核心步骤是求取随机的 g(X1),………,g(Xn),n∈[a,b],由数学期望和大数定理可以近似计算定积分,公式为 2.测试用例 原函数: 导函数:

python 二重积分_python中求二维积分的方法

python中一般求解微积分可以使符号积分求出解析解,使用数值积分求出数值解。在计算机的处理当中,数值解往往更有意义。本文介绍python中利用数值积分例程和微分方程求解器scipy.integration中的dblquad方法求取二维积分的介绍。 1、引入scipy.integratio…

R语言:蒙特卡洛方法求积分

蒙特卡洛方法(MC) 一、蒙特卡洛方法简介二、利用蒙特卡罗方法计算圆周率三、利用蒙特卡洛方法求定积分例1例2例3 总结: 一、蒙特卡洛方法简介 蒙特卡洛方法得名于摩纳哥的蒙特卡洛赌场,是大数定律的经典应用,即用大样本数据计算出…

计算方法(一)——计算机求积分方法,机械求积法

机械求积法 转载请注明出处! 一、引言 随着人工智能的兴起,在计算机领域又一次掀起了数学热,不管是传统的机器学习,还是现在的深度学习,都离不开积分的支撑,那计算机在底层到底是怎样求积分的呢?小编同大家一起探讨。 二、理论推导 我们知道,在我们所学的微积分中我们是…

C++实现龙贝格求积分算法

1. 算法原理简介 T(0)(b-a)(f(a)f(b))/2; H(0)(b-a)f( (ab)/2 ); T(i)(T(i-1)H(i-1))/2。 T(i) 的语义是将积分区间做 2i 等分时复化梯形求积分公式算出的近似值。 H(i) 的语义是将积分区间做 2i 等分时,将每个小区间的长度乘该小区间中点处…

c#求定积分

步骤: 1 安装和使用NuGet插件 教程链接:https://blog.csdn.net/qq_36456952/article/details/55252913 2 安装 C# 科学计算库 Math.NET Numerics 教程链接: https://blog.csdn.net/heray1990/article/details/72467304 注意:在安装 C#…

人工智能数学基础---不定积分4:有理函数求积分的方法

一、引言 在《人工智能数学基础–不定积分2:利用换元法求不定积分》、《人工智能数学基础—不定积分3:分部积分法》分别介绍了换元积分法和分步积分法。但有些函数表达式很复杂,如果直接用换元积分法和分步积分法不好计算积分,这…

求积分方法及积分知识点-----专升本

求积分 一般(常见)求不定积分方法 一般(常见)定积分方法 带三角函数的求积分 凑微分法,拆开,三角代换,分部积分,整体法, 倒三角变正三角,奇拆偶降 几分之一圆…

二维数组、指针详解

二维数组、指针详解: 目录 二维数组、指针详解: 1.研究二维数组的表示。 2.现在研究关于二维数组和指针的关系 1.研究二维数组的表示。 首先,用代码运行进行测试,验证的相关结果, // C.cpp : 定义控制台应用程序…

二维数组与指针

转载自:https://www.cnblogs.com/chenyangyao/p/5222696.html 声明:本文为原创博文,如有转载,请注明出处。若本文有编辑错误、概念错误或者逻辑错误,请予以指正,谢谢。 指针与数组是C/C编程中非常重要的元…

二维数组指针,指针数组与数组指针的区别,一看就懂

目录 一.二维数组基本概念 二.指针数组和数组指针的区别 1.数组指针 2.指针数组 3.总结 三.二维数组的首地址和数组名 四.二维数组如何运用指针? 五.代码分析,加深了解。 一.二维数组基本概念 二维数组在概念上是二维的,有行和列,但在…

二维数组与数组指针详解

二维数组 深入理解二维数组 首先定义一个二维数组 int a[2][3]{{1,2,3},{4,5,6}}; #or int a[2][2]{1,2,3,4};新的理解:我们可以这样认为,a可以看作是一个一维数组,包含2个元素,每个元素恰好是包含3个整型的元素,a这个…

c语言——二维指针数组

1 一维度数组与指针 1.1一维数组元素在内存分布 #include<stdio.h> #include<stdlib.h> #include<string.h>#define ARRAY_SIZE 8void main() {int data[ARRAY_SIZE]{0,1,2,3,4,5,6,7};int i;printf("data address:0x%-8x\r\n",data);for(i0; i&l…

c++二维数组指针

&#xff11;.定义指针指向二维数组 为了方便根据用户输入动态定义二维数组的行和列&#xff0c;引入变量rowsNum(行)&#xff0c;colsNum(列&#xff09;。 以定义&#xff15;行&#xff14;列的二维数组为例&#xff0c; int rowsNum 4;int colsNum 5;float** a new fl…

二维数组名是指针的指针吗?

我们知道一维数组名是常量指针&#xff0c;我们可以将一维数组名赋给一个指针类型再对一维数组进行相关的操作&#xff0c;那二维数组名又是什么&#xff1f; 我们这样初始化一个二维数组int A[3][3]{1,2,3,4,5,6,7,8}或者为int A[3][3]{ {1,2,3},{4,5,6}&#xff0c;{7,8,9}}…

c++二维数组中指针详解

二维数组 a[2][3]{{1,2,3},{4,5,6}};指针p有如下几种表达形式&#xff1a; 1 方式一&#xff1a;int (*p)[3]a (或&a[0]&#xff09;; 一定要加上括号&#xff0c;因为[]的优先级高于*&#xff1b;意思是定义一个指向3个int类型变量的指针。p代表二维数组中第一个…

C语言 二维数组和指针

二维数组可以看成是元素为一维数组的数组&#xff0c;假设有一个三行四列的二维数组a&#xff0c;它定义为&#xff1a; int a[3][4] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; a 是二维数组名。a 数组包含 3 行&#xff0c;即 3 个行元素&#xff1a;a[0]&#xff0c;a[1]…

C/C++指向二维数组的指针

1. 二维数组 设有整型二维数组a[3][4]如下&#xff1a;     0 1 2 3     4 5 6 7     8 9 10 11   它的定义为&#xff1a;       int a[3][4]{{0,1,2,3},{4,5,6,7},{8,9,10,11}}  设数组a的首地址为1000&#xff0c;各下标变量的首地址及其值如图所…

二维数组与二级指针

关于二维数组与二级指针那些你必须知道的事 首先,来看一个例子一个error嗯,我是解析指针数组与数组指针 首先,来看一个例子 #include <iostream>using namespace std;int main(void) {int **p;pnew int*[5];for(int i0;i<5;i){p[i]new int[5];}return 0; }不严格地说…