二项分布是一种离散概率分布,它表示在 n 个独立实验序列中给定数量的成功概率,并且每次试验的成功概率已知。

概率二项分布的质量函数(pmf)定义为:

NumPy 二项式分布

其中,

  • p是每次试验成功的概率
  • q 是每次试验失败的概率,q = 1 - p
  • n 是试验次数
  • k 是 n 次试验中任意位置可能发生的成功次数

二项式分布具有均值 np 和方差 npq。

在 k 处评估的累积分布函数 (cdf) 是随机变量 (X) 的值小于或等于的概率到k。二项分布的cdf定义为:

NumPy 二项式分布

其中,[k] 是小于或等于 k 的最大整数。

NumPy random.binomial() 函数返回二项分布的随机样本。

语法

numpy.random.binomial(n, p, size=None) 

参数

n必填。 指定试验次数,必须为 >= 0。也接受浮点数,但它们会被截断为整数。
p必填。 指定每次试验的成功概率,必须在 [0, 1] 范围内。 float 或 array_like of floats。
size可选。 指定输出形状。 int 或 int 元组。如果给定形状为(m, n, k),则绘制m * n * k个样本。如果 size 为 None(默认),并且 n 和 p 均为标量,则返回单个值。否则,将抽取 np.broadcast(n, p).size 个样本。

返回值

返回参数化二项式分布的样本。 ndarray 或标量。

示例:二项式分布的值

在下面的示例中,random.binomial() 函数用于创建给定矩阵包含从指定二项分布中抽取的随机值的形状。

import numpy as np

size = (5,3)

sample = np.random.binomial(20, 0.5, size)
print(sample) 

上述代码的可能输出可能是:

[[ 8  8 10]
 [ 5  9  8]
 [11  9 12]
 [12  7 11]
 [ 9  9 10]] 

绘制二项分布

示例:直方图

Matplotlib 是一个 Python 绘图库,可用于绘制二项式分布的概率质量函数 (pmf)使用 hist() 函数。

import matplotlib.pyplot as plt
import numpy as np

#修复种子以提高重现性
#结果
np.random.seed(10)

size = 10000
#抽取10000个样本
#二项式分布
sample = np.random.binomial(20, 0.5, size)
bin = np.arange(0,20,1)

plt.hist(sample, bins=bin, edgecolor='blue') 
plt.title("Binomial Distribution") 
plt.show() 

上述代码的输出将是:

NumPy 二项式分布

示例:比较 pmfs

可以使用以图形方式比较多个质量函数seabornkdeplot() 函数。在下面的示例中,比较了三个二项式分布(每个二项式分布的试验次数不同,但成功概率相同)的 pmf。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#修复种子以提高重现性
#结果
np.random.seed(10)

size = 1000
#绘制1000个样本
#不同的二项式分布
sns.kdeplot(np.random.binomial(15, 0.5, size))
sns.kdeplot(np.random.binomial(20, 0.5, size))
sns.kdeplot(np.random.binomial(25, 0.5, size))

plt.legend(["$n = 15, p = 0.5$", 
            "$n = 20, p = 0.5$", 
            "$n = 25, p = 0.5$"])
plt.show() 

上述代码的输出将是:

NumPy 二项式分布

示例:比较 cdf

可以使用 Seaborn ecdfplot() 函数以图形方式比较多个累积分布函数。在下面的示例中,比较了三个二项式分布(每个二项式分布的试验次数不同,但成功概率相同)的 cdf。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#修复种子以提高重现性
#结果
np.random.seed(10)

size = 1000
#绘制1000个样本
#不同的二项式分布
sns.ecdfplot(np.random.binomial(15, 0.5, size))
sns.ecdfplot(np.random.binomial(20, 0.5, size))
sns.ecdfplot(np.random.binomial(25, 0.5, size))

plt.legend(["$n = 15, p = 0.5$", 
            "$n = 20, p = 0.5$", 
            "$n = 25, p = 0.5$"])
plt.show() 

上述代码的输出将是:

NumPy 二项式分布