本文讲解的不是离散分布的一些性质如:方差、期望和概率密度函数pdf(若为离散分布,则是概率质量函数pmf)等。本文要讲解的是如何通过均匀分布来产生其他各种分布的方法。尽管很多编程语言的函数库中包含了这些分布函数:
- 在matlab中,我们可以看到关于这些函数的详细文档及使用方法:
- 在linux C中,GNU有一个名字叫GUN Scientific Library的库,里面有各种分布函数,比如说,高斯分布:
http://www.gnu.org/software/gsl/manual/html_node/The-Gaussian-Distribution.html - 在标准C中,就只有仅仅的rand函数来产生均匀分布,那么这时候就需要使用均匀分布来产生其他分布了。
在下文中,我只是用比较通俗易懂的方式来说明用均匀分布来产生各种其他分布的过程,从而知道如何编程实现,具体原理的证明以及各种分布函数的性质就不具体展开。
离散分布
离散分布主要有以下几种:均匀分布、超几何分布、二项分布、泊松分布、负二项分布、几何分布
基本原理:
对于一个给定的离散分布,我们假设其分布如下:有n个离散的取值分别为x1,x2,⋯,xn,他们的概率分别为Px1,Px1,⋯,Pxn,并且有Px1+Px1+⋯+Pxn=1,设该离散分布的分布函数为F(x),那么,我们可以通过如下步骤来产生该离散分布:
1. 产生区间在[0,1]的均匀分布U
2. 当F(xi)<U≤F(xi+1)时,令X=xi+1,这时X的取值就服从上述给定的离散分布。
上述理论很简单,不过为了更简单明了的说明上述原理步骤,下面通过举例来具体描述:
假设离散分布如下:x的可能取值分别为1,2,3,对应的概率分别为14,14,12。那么其分布函数F(x)可以表示如下:
F(x)=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪0,x<114,1≤x<212,2≤x<31,x≥3
那么通过均匀分布产生上述离散分布的方法由步骤2可知如下式:
X=⎧⎩⎨⎪⎪x1,0<U≤F(x1)x2,F(x1)<U≤F(x2)x3,F(x2)<U≤F(x3)x1=1,x2=2,x3=3
其中,由分布函数F(x)的表达式可知,F(x1)=14,F(x2)=12,F(x3)=1,带入到上式中可知,x取值分别为1,2,3时,对应的概率分别为14,14,12,即服从上面指定的离散分布。
从上面的方法可以看出,只要知道了离散随机变量在各个点的概率就可以使用该方法,通过均匀分布得到指定的分布了。而各个点的概率可以通过概率质量函数(pmf)得到。关于各种离散分布的pmf,我们可以在维基百科上得到。下面通过上面提到的方法,分别以二项分布、泊松分布为例进行Matlab编程实现:
二项分布
clear all
close all
clc
%二项分布
%参数:实验次数n,每次实验成功概率p
%mean=np , var=np(1-p)
n=10,p=0.5
%---------------由Matlab内置函数直接给出--------------%
%二项分布的产生,即n次实验成功的次数X,X<=n
X1= binornd(n,p);
%二项分布概率质量密度pmf
x = 0:n;
Py = binopdf(x,n,p);%当取值分别为x的时候的概率
plot(x,Py,'r*')
hold on
%---------------由均匀分布U推导出--------------------%
N=1000;%样本点数
U=rand(1,N);%U服从均匀分布
for i=0:n
P(i+1)=nchoosek(n,i)*p^i*(1-p)^(n-i);%不同的离散分布只需更改这里的计算公式来计算pmf
end
P=cumsum(P);%得到累计分布函数cdf
X2=U;
for i=1:length(X2)
X2(i)=sum(X2(i)>P);
end
%X2就是我们通过均匀分布得到的服从二项分布的变量
%计算通过均匀分布得到的服从二项分布的pmf,从而与理论的pmf对比
for i=0:n
Y2(i+1)=sum(X2==i);
end
plot([0:n],Y2/N,'bo')
title('二项分布的pmf')
legend('自带函数产生','均匀分布产生')
%--------------------------------------------------------------------%
运行结果如下:
泊松分布
每个分布的实现大致相同,只需要更改计算pmf的公式即可!由于泊松分布在实际问题中非常常见,因此在此赘述。
%泊松分布
%参数:到达率lambda
%mean=lamda, var=lambda
clear all
close all
clc
lambda=1;
n=10;%x的取值为0到无穷大,这里只取前n个
%------------------------由内置函数直接给出---------------------%
%泊松分布的产生,即单位时间内事件发生的次数x,x取值为0到正无穷
X=poissrnd(lambda,1,10);%产生10个服从参数为lamda的泊松分布
%泊松分布的cdf
x=0:n;
Fx=poisscdf(x,lambda);
%figure
%plot(x,Fx,'r*')
%title('泊松分布的cdf')
%泊松分布的pdf
x=0:n;
Px=poisspdf(x,lambda);
figure
plot(x,Px,'r*')
hold on
title('泊松分布的pmf')
%-----------------------由均匀分布推导出-----------------------%
N=1000;%样本点数
U=rand(1,N);%U服从均匀分布
for i=0:n
P(i+1)=exp(-lambda)*lambda^i/factorial(i);%不同的离散分布只需更改这里的计算公式来计算pmf
end
P=cumsum(P);
X2=U;
for i=1:length(X2)
X2(i)=sum(X2(i)>P);
end
%X2就是我们通过均匀分布得到的服从参数为lambda的泊松分布的变量
%计算通过均匀分布得到的服从泊松分布的pmf,从而与理论的pmf对比
for i=0:n
Y2(i+1)=sum(X2==i);
end
plot([0:n],Y2/N,'bo')
title('泊松分布的pmf')
legend('自带函数产生','均匀分布产生')
显示结果如下:(到达率lambda为1时)
原文:http://blog.csdn.net/tengweitw/article/details/45584597
作者:nineheadedbird