Python中的np.random.binomial()⼆项式分布函数详解
看了很多博客,感觉很多⼈对np.random.binomial()的解释都写得不是很清楚,或者写错了,特别是对该函数的参数解释。本⽂以⼆项式分布的理论概念为起点,对该函数进⾏解释,欢迎讨论指正。
⼆项式分布
⼆项分布是由伯努利提出的概念,指的是重复n次(注意:这⾥的n和binomial()函数参数n不是⼀个意思)独⽴的伯努利试验,如果事件X 服从⼆项式分布,则可以表⽰为X~B(n,p),则期望E(X)=np,⽅差D(X)=np(1-p)。简单来讲就是在每次试验中只有两种可能的结果(例如:抛⼀枚硬币,不是正⾯就是反⾯,⽽掷六⾯体⾊⼦就不是⼆项式分布),⽽且两种结果发⽣与否互相对⽴,并且相互独⽴,与其它各次试验结果⽆关,事件发⽣与否的概率在每⼀次独⽴试验中都保持不变。
函数原型及参数:numpy.random.binomial(n,p,size=None)
官⽅参数的解释如下:
参数解释
n int型或者⼀个int型的数组,⼤于等于0,接受浮点数但是会被截断(官⽅解释:n is truncated to an integer,例如:输⼊4.6或者4.2都会被当
做4来计算)成整数来使⽤。
p float或者⼀组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。注意:每次返回的结果具有随机性,因为⼆项式分布本⾝就是随机试验。
给出⼏个例⼦:
例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类型):
random python
[[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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。