一种生成poisson随机数的算法
背景知识——naive monte carlo
我们知道,利用naive monte carlo 来求poisson 随机变量的期望可以表示为如下公式
X^n=1n∑i=1nXi
X
^
n
=
1
n
∑
i
=
1
n
X
i
其中 {Xi}i=1,…,n { X i } i = 1 , … , n 独立同分布,服从参数为 β β 的poisson分布。
由大数定律可知,有
X^n⟶a.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!m∈Z+ 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 u 服从(0,1)上的均匀分布
- 第三步:按如下步骤计算poisson分布函数的逆函数寻找
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=m0−1 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)<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
运行结果:
>> x=poisson(2,1e5);[mean(x), var(x)]
ans =
1.9993 2.0010
>> hist(x,100)
注:
该方法更多细节参考文献(2)
————————————————————————————————————