您的当前位置:首页正文

Python中的np.random.binomial()二项式分布函数详解

2024-11-25 来源:个人技术集锦

1 二项式分布

二项分布是由伯努利提出的概念,指的是重复n次(注意:这里的n和binomial()函数参数n不是一个意思)独立的伯努利试验,如果事件X服从二项式分布,则可以表示为X~B(n,p),则期望E(X)=np,方差D(X)=np(1-p)。简单来讲就是在每次试验中只有两种可能的结果(例如:抛一枚硬币,不是正面就是反面,而掷六面体色子就不是二项式分布),而且两种结果发生与否互相对立,并且相互独立,与其它各次试验结果无关,事件发生与否的概率在每一次独立试验中都保持不变。

2 函数原型及参数释义:numpy.random.binomial(n,p,size=None)

官方参数的解释如下:

参数解释
nint型或者一个int型的数组,大于等于0,接受浮点数但是会被截断(官方解释:n is truncated to an integer,例如:输入4.6或者4.2都会被当做4来计算)成整数来使用。
pfloat或者一组float的数组,0≤p≤1;
size可选项,int或者int的元组,表示的输出的大小,如果提供了size,例如(m,n,k),那么会返回m×n×k个数值。如果size=None,也就是默认没有的情况,当n和p都是一个数字的时候只会返回一个值,否则返回的是np.broadcast(n,p).size个数值。
reture返回值。size是一个整数N时,返回一个长度为N的一维数组;size是(X,Y)类型元组时,返回一个X行Y列二维数组;size是(X,Y,Z)类型元组时,返回一个三维数组(三维数组不能以三维形式直接输出,会输出X个Y行Z列的二维数组,以此类推)。

官方解释中只规定了参数的类型和范围,但是并没有给出具体的数学意义,不便于理解。现在对逐个参数进行解释:

参数n一次试验的样本数n,并且相互不干扰。 有些博客解释这里的参数n是试验次数,我认为不对,或许现在看起来好像一次试验n个互不相干的样本n次试验一个样本是一样的,但是如果把n理解为试验次数,那和size参数的意义会产生冲突;

参数p:事件发生的概率p,范围[0,1]。这里有个理解的关键就是 “事件发生”到底是指的什么事件发生?准确来讲是指:如果一个样本发生的结果要么是A要么是B,事件发生指的是该样本其中一种结果发生。

参数size:限定了返回值的形式(具体见上面return的解释)和实验次数。当size是整数N时,表示实验N次,返回每次实验中事件发生的次数;size是(X,Y)时,表示实验X*Y次,以X行Y列的形式输出每次试验中事件发生的次数。(如果将n解释为试验次数而不是样本数的话,这里返回数组中数值的意义将很难解释)。

return返回值 : 以size给定的形式,返回每次试验事件发生的次数,次数大于等于0且小于等于参数n。注意:每次返回的结果具有随机性,因为二项式分布本身就是随机试验。

3 实例分析

例1: n=1时,重复伯努利试验。
一次抛一枚硬币试验,正面朝上发生的概率为0.5,做10次实验,求每次试验发生正面朝上的硬币个数:

test = np.random.binomial(1, 0.5, 10)
print(test)

输出:[1 1 1 0 1 1 1 0 0 0]

例2: n>1时,多个样本进行试验:
一次抛5枚硬币,每枚硬币正面朝上概率为0.5,做10次试验,求每次试验发生正面朝上的硬币个数:

test = np.random.binomial(5, 0.5, 10)
print(test)

输出:[1 5 5 2 4 2 3 3 2 3]

例3: size为元组的形式时:
一次抛5枚硬币,每硬币正面朝上概率为0.5,做50次试验,求每次试验发生正面朝上的硬币个数:

test = np.random.binomial(5, 0.5, (10, 5))
print(test)

输出二维数组(ndarray类型):

[[1 2 2 4 1]
 [2 5 3 4 3]
 [1 4 1 2 4]
 [3 1 1 3 1]
 [1 4 2 4 2]
 [0 1 3 2 2]
 [4 2 1 1 2]
 [2 5 3 2 3]
 [1 1 2 2 2]
 [3 2 1 4 2]]

例4: 一次抛2个硬币,每枚硬币抛到正反两面的概率都是0.5,那么两个硬币都是正面的概率是多少?发生一正一反的概率是多少?
显然答案是0.25和0.5,试验次数越大,越能接近理论概率:

test = sum(np.random.binomial(2, 0.5, 100000) == 2) / 100000
print(test)

输出:0.24843

test = sum(np.random.binomial(2, 0.5, 100000) == 1) / 100000
print(test)

输出:0.49938

显示全文