二项分布是一种离散概率分布,它表示在 n 个独立实验序列中给定数量的成功概率,并且每次试验的成功概率已知。
概率二项分布的质量函数(pmf)定义为:
其中,
- p是每次试验成功的概率
- q 是每次试验失败的概率,q = 1 - p
- n 是试验次数
- k 是 n 次试验中任意位置可能发生的成功次数
二项式分布具有均值 np 和方差 npq。
在 k 处评估的累积分布函数 (cdf) 是随机变量 (X) 的值小于或等于的概率到k。二项分布的cdf定义为:
其中,[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()
上述代码的输出将是:
示例:比较 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()
上述代码的输出将是:
示例:比较 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()
上述代码的输出将是: