zoukankan      html  css  js  c++  java
  • 高斯分布的采样

    高斯分布的采样

    任意高斯分布都可以由正态分布通过拉伸和平移得到,所以这里只考虑标准正态分布

    逆变换法

    • 产生([0, 1])上的均匀分布随机数(mu)
    • (z = sqrt{2} erf^{-1}(2mu - 1)),则(z)服从标准正态分布。其中erf是高斯误差函数,它是标准正态分布的累积分布函数经过简单平移和拉升变换后的形式,定义如下

      [erf(x) = frac{2}{sqrt{pi}} int_0^x e^{-t^2}dt ]

    • erf的逆函数不好求解

    Box-Muller算法

    • 考虑两个独立的高斯分布的联合分布
    • 假设(x,y)是两个服从标准正态分布的独立随机变量
    • 具体采样过程如下:
      • 产生([0, 1])上的两个独立的均匀分布随机数(mu_1, mu_2)
      • (egin{cases} x = sqrt{-2ln(mu_1)}cos2pi mu_2 \ y = sqrt{-2ln(mu_1)}sin2pi mu_2 end{cases}),则(x,y)服从标准正态分布,并且是相互独立的
    • 需要计算三角函数,比较耗时
    • Marsaglia polar method
      • 在单位圆盘上产生均匀分布随机数对((x,y))
      • (s = x^2 + y^2),则(xsqrt{frac{-2ln s}{s}}), (ysqrt{frac{-2ln s}{s} })是两个服从标准正态分布的样本

    拒绝采样法

    • 选择指数分布作为参考分布,取(lambda = 1)的指数分布,其密度函数为(q(x)=e^{-x})
    • 对应的累积分布函数及其逆函数分别为

      [F(x) = 1 - e^{-x} ]

      [F^{-1}(mu) = -log (1-mu) ]

    • 利用逆变换法很容易得到指数分布的样本,再根据拒绝采样法决定是否接受该样本,接收概率为

      [A(x) = frac{p(x)}{Mcdot q(x)} ]

      其中(p(x)=frac{2}{sqrt{2pi}}e^{-frac{x^2}{2}} (x geq 0))是标准正态分布压缩到正半轴后的概率密度函数,常数因子(M)需要满足如下条件:

      [p(x) leq M cdot q(x) ]

    • 计算后得到接受概率

      [A(x) = e ^{-frac{(x-1)^2}{2}} ]

    • 具体采样过程如下:
      • 产生([0,1])上的均匀分布随机数(mu_0),计算(x = F^{-1}(mu_0))得到指数分布的样本(x)
      • 再产生([0,1])上的均匀分布随机数(mu_1),若(mu_1 < A(x)),则接受(x),否则重新采样
      • 再产生([0,1])上的均匀分布随机数(mu_2),若(mu_2 < 0.5),则将(x)转化为(-x),否则保持不变
    • Ziggurat算法:采用多个阶梯矩形来逼近目标分布,提高接受概率
  • 相关阅读:
    hdu4549(费马小定理 + 快速幂)
    java 四种实现延迟加载的方法
    浅谈java缓存
    JavaWeb实现文件上传下载功能实例解析
    java分页之页面分页
    浅析Java开发模式—Model1、Model2和三层
    构建一个简单的基于MVC模式的JavaWeb
    Java中MVC详解以及优缺点总结
    Servlet
    通过JDBC进行简单的增删改查(以MySQL为例)
  • 原文地址:https://www.cnblogs.com/weilonghu/p/11922677.html
Copyright © 2011-2022 走看看