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

一种生成poisson随机数的算法

背景知识——naive monte carlo

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

X^n=1ni=1nXi X ^ n = 1 n ∑ i = 1 n X i

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

由大数定律可知,有

X^na.s.E[Xi]=β X ^ n ⟶ a . s . E [ X i ] = β

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

经典poisson随机变量生成

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

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

    其中 Fβ F β 是poisson分布函数
    Fβ(m)=k=0mβkeβk!mZ+ F β ( m ) = ∑ k = 0 m β k e − β k ! m ∈ Z +

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

Proposed poisson variable generator

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

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

运行结果:

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

ans =

    1.9993    2.0010
>> hist(x,100)

[matlab]一种生成poisson随机数的算法_第1张图片

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

你可能感兴趣的:(random,variables)