X^n=_matlab poisson随机数">
当前位置:   article > 正文

[matlab]一种生成poisson随机数的算法_matlab poisson随机数

matlab poisson随机数

一种生成poisson随机数的算法

背景知识——naive monte carlo

我们知道,利用naive monte carlo 来求poisson 随机变量的期望可以表示为如下公式

ˆXn=1nni=1Xi
X^n=1ni=1nXi

其中 {Xi}i=1,,n {Xi}i=1,,n独立同分布,服从参数为 β β的poisson分布。

由大数定律可知,有

ˆXna.s.E[Xi]=β

由中心极限定理知,上述逼近在弱收敛意义下的收敛速度是 O(1n)
因此,为了计算 ˆXn ,自然而然的一个问题是如何生成 Xi

经典poisson随机变量生成

最经典,也是最常用的方法就是利用poisson分布函数的逆函数来产生服从poisson 分布的随机数,步骤如下:

  • 从(0,1)上的均匀分布采样出u
  • 利用poisson 分布的逆函数得到poisson 变量
    m:=inf{m|Fβ(m)>u}

    其中Fβ是poisson分布函数
    Fβ(m)=mk=0βkeβk!mZ+

但这种方法在β很大时,计算量会比较大。

Proposed poisson variable generator

该新方法基于的理论支持是:poisson分布P(β)分布一致逼近正态分布N(β,β) 。参考文献(1)
该方法步骤如下:

  • 第一步:生成服从N(0,1)分布的随机数z (参考另外一篇生成正态随机数的博客)
  • 第二步:计算u=Φ(z), 则u服从(0,1)上的均匀分布
  • 第三步:按如下步骤计算poisson分布函数的逆函数F1β寻找m
    • m0=max([β+zβ],0)
    • 如果 Fβ(m0)<u, 则将使m0=1+m0直到Fβ(m0)>u,并记m=m0
    • 如果 Fβ(m0)>u, 则将使m0=m01直到Fβ(m0)<u,并记m=m0+1

代码示例

function x=poisson(lamda, size)
%输入:poisson分布的强度lamda, 要产生的随机变量数目size
%输出:poisson 随机变量序列x
x=zeros(1,2*size);
for i=1:size
    u=unifrnd(0,1,1,2); %生成(0,1)上的均匀分布变量
   %% 生成独立的服从参数为(0,1)的正态分布变量(参考另外一篇博客中的介绍)
    X1=sqrt(-2*log(u(1)))*cos(2*pi*u(2));
    X2=sqrt(-2*log(u(1)))*sin(2*pi*u(2));
   %% 生成独立的服从参数为 lamda 的poisson分布变量
   z=normcdf([X1, X2]);
   x(2*i-1)=pois_rand(lamda, X1, z(1)); x(2*i)=pois_rand(lamda, X2, z(2));
end
end 

function m=pois_rand(lamda, x, z)
%搜索m*
    m0=max(floor(lamda+x*sqrt(lamda)), 0);
    if F(lamda, m0)<z
        m=m0+1;
        while F(lamda, m)<z
            m=m+1;
        end
    else 
        m=m0;
        while F(lamda, m)>=z
            m=m-1;
        end
        m=m+1;
    end
end

function F=F(lamda, m)
%poisson分布的分布函数
if m<0
    F=0;
else
     F=exp(-lamda);
     for i=1:m
         F=F+lamda^(i)*exp(-lamda)./factorial(i);
     end
end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

运行结果:

>> x=poisson(2,1e5);[mean(x), var(x)]

ans =

    1.9993    2.0010
>> hist(x,100)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里写图片描述

注:
该方法更多细节参考文献(2)
————————————————————————————————————

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/910715
推荐阅读
相关标签
  

闽ICP备14008679号