首页 > 其他分享 >蒙特卡洛积分-重要性采样原理及其应用

蒙特卡洛积分-重要性采样原理及其应用

时间:2023-07-28 10:47:46浏览次数:54  
标签:采样 概率密度函数 函数 积分 分布 double pdf 蒙特卡洛

我自己是数学菜逼,所以我在学习数学之类的内容的时候,我基本上会去找视频看,虽然视频比较耗时间,但数学真的很难,没办法,菜逼一个。好在在b站上找到一位数学老师有这个视频讲解,真的救命呀!!!放下视频链接https://www.bilibili.com/video/BV17D4y1o7J2?p=1&vd_source=4451d7e9f1ccf3c1318002d60666d680。下面记录一下笔记。


蒙特卡洛积分主要原理是通过随机抽样来估算。假设我们有一个概率密度(分布)函数如下,是某学校女生身高的分布

 

假设我们想算身高平方的均值,f(x)是概率密度函数,g(x)=x2,身高平方的均值也就是

但是因为这个积分解析式不一定能解出来,我们可以在概率密度函数的分布中抽取样本X,也就是在某学校女生中抽样,然后计算g(X),进而算术平均

但在数学中如何找到可以服从概率密度分布的样本呢,这里需要用到累积分布函数

由于累积分布函数从0到1,它的函数图像如下

我们在累积分布函数的纵坐标上随机取一个数i,找到它在横坐标上对应的值xi,这个xi就是符合概率密度函数的样本了,xi的求解也就是累积分布函数的逆函数了,这个也就是重要性采样

到这里就可以解出来了。

我们经常看到在图形学中的渲染公式中那一长串的被积函数,然后就突然变成了一长串除以pdf了,那这个除以pdf是怎么来的呢?

假设我们要求f(x)在(a,b)上的定积分(面积),g(x)是一个概率密度函数,我们可以把这个式子变形

我们可以把f(x)/g(x)看成一个整体z(x),那这样不就是对应我们前面的列子了吗,就相当于变成了求z(x)的均值了,然后我们就可以采样得出结果了,有一些细节就是概率密度函数的积分为1,也就是

然后我们的式子就变成这样了

 对,这样就变成了我们经常看到的除以pdf的那种样子了。

下面举一个实例,求解y=x2在(0,8)之间的面积,用定积分的解析式很好求,但这里用蒙特卡洛重要采样来解积分。首先pdf是随便的,这里取概率密度函数p(x)=3/8*x2,尽量贴合原积分函数,然后我们求出累积分布函数P(x)=x3/8,按照上面的讲解我们求出累积分布函数的逆函数P-1(x)=2*x1/3。代码中只采样了一个点,但得到的结果还是比较准确的

#include <iostream>
#include <random>
#include <iomanip>

double random_double(double min, double max)
{
    // 使用rd来生成一个真正的随机数生成器
    std::random_device rd;

    // 使用该随机数生成器初始化Mersenne Twister引擎
    std::mt19937 engine(rd());

    // 创建一个分布,在min和max之间均匀分布
    std::uniform_real_distribution<> distrib(min, max);

    // 生成一个均匀分布的随机数
    return distrib(engine);
}

inline double pdf(double x)
{
    return 3 * x * x / 8;
}

int main()
{
    int N = 1;
    auto sum = 0.0;
    for (int i = 0; i < N; i++)
    {
        //这里就是用累积分布函数的逆函数来求解符合概率密度函数的分布
        auto x = 2*pow(random_double(0, 1), 1.0 / 3.0);
        sum += x * x / pdf(x);
    }
    std::cout << std::fixed << std::setprecision(12);
    std::cout << "I = " << sum / N << '\n';
}

结果如下:

标签:采样,概率密度函数,函数,积分,分布,double,pdf,蒙特卡洛
From: https://www.cnblogs.com/lsy-lsy/p/17586292.html

相关文章

  • v4l2采样usb摄像头并显示
    ubuntu思路:1、首先理解camera工作原理,重点理解 yuv,rgb视频流,即Sensor数据输出的图像格式;大体过程:光线通过镜头Lens进入摄像头内部,通过IR过滤掉红外光,抵达sensor,sensor将光信号转为电信号,在通过ADC电路转为数字信号,此时的数据格式是RAWData;Senso......
  • 计算并统计信号采样值发生变化的间隔时间的简单程序
    (实现方式:octave/matlab)以下是一个简单的MATLAB代码示例,用于统计信号采样值S(采样周期固定)发生变化的时间间隔并绘制统计直方图:%数据P示例S=[1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4];%计算时间间隔time_intervals=diff(find(diff(S)~=0));%绘制......
  • 蒙特卡洛模拟
    MonteCarloSimulationIntroduction蒙特卡洛是西欧小国摩纳哥最著名的一区,以豪华的赌场闻名于世。(赌场,意味着大量重复的随机过程)蒙特卡洛模拟是一种,通过大量随机采样,预测不确定事件可能结果的的数学技术。这个想法的数学保证是大数定律(Lawoflargenumbers):样本数量越多,则其算......
  • 【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算
    ......
  • Python数学建模系列(六):蒙特卡洛算法
    文章目录前言往期文章1、蒙特卡洛算法样例1样例2样例32、三门问题3、M*M豆问题结语前言Hello!小伙伴!非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ 自我介绍ଘ(੭ˊᵕˋ)੭昵称:海轰标签:程序猿|C++选手|学生简介:因C语言结识编程,随后转入计算机专业,有幸拿过一些国奖......
  • 拓端tecdat|R语言贝叶斯Metropolis-Hastings Gibbs 吉布斯采样器估计变点指数分布分析
    原文链接:http://tecdat.cn/?p=26578 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于吉布斯采样器的研究报告,包括一些图形和统计输出。指数分布是泊松过程中事件之间时间的概率分布,因此它用于预测到下一个事件的等待时间,例如,您需要在公共汽车站等待的时间,直到下一班车......
  • 强化学习:基于蒙特卡洛树和策略价值网络的深度强化学习五子棋(含码源)
    强化学习:基于蒙特卡洛树和策略价值网络的深度强化学习五子棋(含码源)特点自我对弈详细注释流程简单代码结构net:策略价值网络实现mcts:蒙特卡洛树实现server:前端界面代码legacy:废弃代码docs:其他文件utils:工具代码network.py:移植过来的网络结构代码model_5400.p......
  • 【HMS Core】Health Kit 步数数据查询步骤咨询,血压/血氧的原子采样统计数据类型问题咨
    ​【问题描述】1、在进行步数查询---多日统计数据查询的时候,postman测试,发现了采样数据类型不匹配问题多日统计查询时,数据类型为 "com.huawei.continuous.steps.total"报错。反而数据类型为明细采样数据类型时“com.huawei.continuous.steps.delta”,正常返回。2、血压/血氧的......
  • SimpleITK 重采样数据到固定尺寸
    1、resampleSize这个重采样不是重采样Spacing,却是重采样size,为了达到所有的数据一致的size例如:(880,880,12)采样统一的(880,880,16)因为假如3DUnet网络数据设置了输入格式为(N,C,16,xxx,xxx),可以把每个数据的size都重采样(16,xxx,xxx),然后输入网络。如果直接设置Size为(1......
  • 数学复习 定积分的应用
    这里主要复习积分的几何应用首先按应用情况进行梳理:(1)求平面图形的面积这部分的应用分为平面直角坐标和极坐标两种情况平面直角坐标的情况:当对x积分时,其取微分的方法是取长为f(x)-g(x),宽为dx的小矩形极坐标的情况在这种方法中,取微分的方法是取角度为dθ的狭窄的小扇形,整......