zoukankan      html  css  js  c++  java
  • 蒙特卡洛积分法(二)

    上一次我们谈到,使用蒙特卡洛积分法求积分涉及到两个问题:1.如何对一个任意分布函数进行抽样; 2.如何减少方差。这里我们先来探讨第一个问题,给定一个概率密度函数,如何对其进行采样,使采样满足其概率分布。
    平常有两种方法实现:

    1.逆变换算法

    假设我们有一个概率分布函数p(x),对它取积分,可以得到它累积分布函数P(x),这个函数根据性质我们知道它的值域是一定分布在[0,1]区间的。那么通过它的反函数就可以实现输入[0,1]之间的随机数,得到符合概率密度分布的采样点。
    我们可以从一个离散分布的图像中来加深理解,下图是一个离散分布函数p(x):

    它的累积分布函数如下:

    可以看到,当我们取值域上的一点ξ,它对应的定义域值为3。p(3)的值较大,因此它也就有更多几率被采样到。也就是说对于,输入一个均匀采样的[0,1]值,就可以得到符合p(x)概率分布的定义域采样点。
    因此逆变换算法的过程如下:
    1.首先计算p(x)的累积分布函数
    2.计算累积分布函数的反函数
    3.然后在[0,1]均匀分布随机产生一个随机数ξ
    4.最后将ξ带入中求出满足p(x)分布的随机数。

    2.取舍算法

    当累计分布函数或其反函数没有显示的解析表达式,或者概率密度函数没有边界,不能归一化的时候,逆变换算法就无法使用,此时应当使用取舍算法。
    取舍算法的思路非常简单,假设一个任意函数f(x)被限定在[a,b]区间,在此区间外的所有值均为0,我们想对它进行采样。我们有一个概率分布函数p(x)使得cp(x)>f(x),那么取舍法的过程如下:
    1.产生一个均匀分布在[a,b]的随机数x
    2.产生一个均匀分布在[0,cp(x)]上的随机数y
    3.若y<f(x),则接受这个采样,否则继续产生新的随机数
    下图是f(x)和p(x)的示意图。其实这个方法就是要判断生成的随机数是否在f(x)的范围以内。

  • 相关阅读:
    Visual Studio 2008 SP1 & .NET Framework 3.5 SP1 使用感受
    体验 DreamSpark
    如何在vc 6.0下配置 opencv 1.0
    注释一个opencv摄像头程序
    Java数据库设计中的14个技巧
    DataReader的使用
    JSP是不是Java发展史上的一大败笔?
    双十一谁才是受益者?
    用JAVA中的多线程示例生产者和消费者问题
    SQL的基本操作
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/12179984.html
Copyright © 2011-2022 走看看