文章目录
- 二项分布
- 多项分布
函数 | 概率密度函数(PDF) | 备注 |
---|---|---|
binomial(n, p) | P ( k ) = ( n k ) p k ( 1 − p ) n − k P(k) = \binom{n}{k}p^k(1-p)^{n-k} P(k)=(kn)pk(1−p)n−k | 二项分布 |
poisson([lam]) | f ( k ) = λ k e − λ k ! f(k)=\frac{\lambda^ke^{-\lambda}}{k!} f(k)=k!λke−λ | 泊松分布 |
multinomial(n, pvals) | 多项分布 |
从二项分布到泊松分布
二项分布
在理解多项分布之前,需要建立起二项分布的基本概念,在 N N N次独立重复的伯努利试验中,设A在每次实验中发生的概率均为 p p p。则 N N N次试验后A发生 k k k次的概率分布,就是二项分布,记作 X ∼ B ( n , p ) X\sim B(n,p) X∼B(n,p),则
P { X = k } = ( n k ) p k ( 1 − p ) n − k P\{X=k\}=\binom{n}{k}p^k(1-p)^{n-k} P{X=k}=(kn)pk(1−p)n−k
import numpy as np
from numpy.random import binomial
import matplotlib.pyplot as plt
fig = plt.figure()
ps = [0.2, 0.5, 0.7]
for i in range(3):
ax = fig.add_subplot(1,3,1+i)
ax.set_title(f"p={ps[i]}")
for n in [50,100,200]:
xs = binomial(n, ps[i], size=10000)
ax.hist(xs, bins=100, alpha=0.6, label=f"n={n}")
plt.legend()
plt.show()
效果如图所示
可见随着p
越来越大,
X
X
X发生的概率越来越趋近于
n
n
n。
多项分布
多项分布是对二项分布的一个自然的推广。
二项分布最常见的案例就是投硬币,那么投掷硬币可能有两个结果产生,所以谓之二项;如果把硬币改成骰子,由于骰子有6个面,相当于每次对应六个可能发生的结果,从而可以谓之六项分布。总而言之,把一个总体按照某种属性分成有限个类的时候,就会涉及到多项分布,其概率表达式为
P ( X 1 = n 1 , ⋯ , X r = n r ) = n ! n 1 ! n 2 ! ⋯ n r ! p 1 n 1 p 2 n 2 ⋯ p r n r P(X_1=n_1,\cdots,X_r=n_r)=\frac{n!}{n_1!n_2!\cdots n_r!}p_1^{n_1}p_2^{n_2}\cdots p_r^{n_r} P(X1=n1,⋯,Xr=nr)=n1!n2!⋯nr!n!p1n1p2n2⋯prnr
当 r = 2 r=2 r=2时,多项分布就退化为了二项分布。
在Python中,多项分布函数为
multinomial(n, pvals)
其中,pvals
为一个数组,用于表示每个事件发生的概率,而且pvals
之和为1,这也很好理解,以仍骰子为例,每个面的概率是
1
6
\frac16
61,其和必为1。
由于多项分布的这种多元性质,multinomial
与np.random
中的其他分布有一个重要区别,即多项分布得到的随机数组是二维的,如果pvals
中有N项,那么输出结果就有
N
N
N列。
import numpy as np
from numpy.random import multinomial
import matplotlib.pyplot as plt
ps = [0.1, 0.2, 0.3, 0.4]
xs = multinomial(300, pvals=ps, size=20000)
for x,p in zip(xs.T, ps):
plt.hist(x, bins=150, range=(0,150),
alpha=0.5, label=f"p={p}")
plt.legend()
plt.show()
结果为