【小白话通信】离散分布的生成

本文讲解的不是离散分布的一些性质如:方差、期望和概率密度函数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

时间: 2024-09-27 05:01:37

【小白话通信】离散分布的生成的相关文章

【小白话通信】离散分布之间的关系

前面文章<离散分布的产生>中,主要讲述了如何通过均匀分布来产生各种离散分布.下面我给出一些离散分布之间的关系,从而可以由一种已知的分布来产生另一种分布. 伯努利分布.二项分布与多项分布 伯努利分布 定义:一个离散随机变量X的取值仅为0和1,且其分布律 P(X=1)=p,P(X=0)=1−p 则此随机变量服从伯努利分布. 实例:抛硬币就是伯努利分布,伯努利分布产生的结果就是1或则0(正面或则反面). 二项分布 定义:设B1,B2,⋯,Bn(n∈N)为相互独立的服从参数为p(p∈[0,1])的伯努

【小白话通信】连续分布的产生

由于篇幅有限,前一篇文章<离散分布的产生>中只讲述了用均匀分布产生离散分布的方法,那么本文接着讲如何利用均匀分布产生连续分布的方法. 连续分布 连续分布主要有以下几种:均匀分布 伽马分布 正态分布 贝塔分布 柯西分布 对数正态分布 双指数分布. 产生各种连续分布的方法有很多,我把它分为两类:通用方法.特殊方法.特殊方法就是根据各个连续分布的特性而特有的方法. 通用方法 通用方法指的是对于各种连续分布理论上都适用的方法.下面只讲解分布函数法.舍取法这两种通用的方法. 分布函数法 概率积分变换定理

【小白话通信】连续分布之间的关系

前面的文章<连续分布的产生>中,我主要讲述了用均匀分布生成各种连续分布的方法,其中的特殊方法都是利用分布之间的关系来生成的.那么,本文主要介绍连续分布之间的一些关系. 伽马分布与泊松分布的关系 假设X∼gamma(α,β),Y∼Poisson(x/β),当α是整数的时候,下面等式成立: P(X≤x)=P(Y≥α) 伽马分布与卡方分布的关系 服从形状参数为α,尺度参数为β的伽马分布的概率密度函数pdf可以表示为: f(x)=x(α−1)e(−x/β)Γ(α)βα 现在,我们假设α=p/2,其中p

ASP小偷偷取地址并生成html

ASP小偷偷取地址并生成html <% function getHTTPPage(url)   dim Http   set Http=server.createobject("MSXML2.XMLHTTP")   Http.open "GET",url,false   Http.send()   if Http.readystate<>4 then        exit function   end if   getHTTPPage=bytes

在web开发中, html开发有没有体积比较小的操作简单的生成工具?

问题描述 在web开发中, html开发有没有体积比较小的操作简单的生成工具? 在web开发中, html开发有没有体积比较小的操作简单的生成工具? 解决方案 dreamware,不过推荐vs2013,ide爽..特别js.. 解决方案二: notepad++ .... 解决方案三: 计算公式"> 解决方案四: 记事本 解决方案五: notepad++.editplus 解决方案六: 文本编译软件够小了吧

一个简单的语言的语法(三):做些小调整,并将生成目标换到CSharp2

为了后面的tree grammar更简洁,本篇对上一篇的树重写规则和一些语法细节做了些调整.并且,将 生成的lexer和parser的源码目标换到了CSharp2,以便后面能使用一些.NET的库. 要使用CSharp2的目标,需要从官网下载相应的运行时库.当前的最新版是3.1.1,可以从这里获取. CSharp/CSharp2目标的详细情况,可以查阅官网上的文档.以上一篇的语法为基础,要换到CSharp2目标 只要把几个嵌入动作里的System.out.println换成Console.Writ

一个JAVA小项目--Web应用自动生成Word_java

前段时间接到一个Web应用自动生成Word的需求,现整理了下一些关键步骤拿来分享一下. 思路:(注:这里只针对WORD2003版本,其它版本大同小异.) 因为WORD文件内部的数据及格式等是通过XML文件的形式存储的,所以WORD文件可以很方便的实现由DOC到XML格式的相互转换,而操作XML文件就方便的多了,这样就实现了与平台无关的各种操作,通过节点的查询.替换.删除.新增等生成Word文件.所以,根据模板生成WORD文件实质就是由用户数据替换XML文件中特殊标签,然后另存为一个DOC文件的过

serializable-java 序列化有什么意义?(希望能用白话讲解)

问题描述 java 序列化有什么意义?(希望能用白话讲解) 序列化生成的文件,我写了个类就能拿到对象.那这还有什么意义,没什么加密作用啊? 是我理解错了吗? 我的测试代码: class Cat implements Serializable{ private String name; public Cat(){ this.name = "new cat"; } public String getName(){ return this.name; } public void setNam

用C#生成不重复的随机数

对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数.伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了.伪随机数的选 择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地"随机",随机种子的选择就显得非常重要.如果随机种子一样,那么同一个随机数发生器产生 的随机数也会一样.一