Python生成多项分布随机数

文章目录

    • 二项分布
    • 多项分布

函数 概率密度函数(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(1p)nk 二项分布
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) XB(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(1p)nk

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!p1n1p2n2prnr

r = 2 r=2 r=2时,多项分布就退化为了二项分布。

在Python中,多项分布函数为

multinomial(n, pvals)

其中,pvals为一个数组,用于表示每个事件发生的概率,而且pvals之和为1,这也很好理解,以仍骰子为例,每个面的概率是 1 6 \frac16 61,其和必为1。

由于多项分布的这种多元性质,multinomialnp.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()

结果为

Python生成多项分布随机数_第1张图片

你可能感兴趣的:(#,Numpy,python,多项分布,统计,随机数)