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算法:采用多个阶梯矩形来逼近目标分布,提高接受概率
  • 相关阅读:
    如何让百度网盘下载速度达60MB/s!
    记一次内存溢出问题的排查、分析过程及解决思路
    使用maven命令打包可执行jar方法
    java实现四则运算
    POI如何合并单元格
    我是如何从功能测试成功转型自动化测试人员的?
    Edgar:Netflix分布式系统的可视化问题诊断平台实践
    Uber的API生命周期管理平台边缘网关(Edge Gateway)的设计实践
    UBer面向领域的微服务体系架构实践
    技术团队:问题被过度的夸大小题大做,你该怎么办?
  • 原文地址:https://www.cnblogs.com/weilonghu/p/11922677.html
Copyright © 2011-2022 走看看