二项分布(binomial distribution)公式:
n为实验总次数,k是成功的次数,p是成功概率
P(X=k)=C_n^kp^k(1-p)^{n-k}
numpy给出的api是:
numpy.random.RandomState.binomial(n, p, size=None)
表示对一个二项分布进行采样(size表示采样的次数,draw samples from a binomial distribution.),参数中的n,p分别对应于公式中的n,p,函数的返回值表示n中成功(success)的次数。
例子
可能说起来比较抽象,我们以一个具体的实例进行阐释:
说野外正在进行9(n=9)口石油勘探井的发掘工作,每一口井能够开发出油
的概率是0.1(p=0.1)。请问,最终所有的勘探井都勘探失败的概率?
如果手动计算的话,自然简单运用中学概率知识便可秒答
P(X=0)=C_9^0p^0(1-p)^{n-0}approx0.3874
因为np.random.binomial()进行的是采样工作,为了逼近这一概率,我们需要进行的是采用统计的方法进行对概率值的逼近:
n, p = 9, .1
采样2000次,返回值表示2000次采样中n(即9)中成功的次数
这里对成功次数为0的实验进行个数统计加和
sum(np.random.binomial(n, p, size=20000)==0)/20000.
0.3833
np.random.binomial函数返回的其实是一个ndarray,ndarray每个元素代表相应的一次采样实验(一次实验进行n次)中成功的次数,明白了这一点,就很好理解了:
n, p = 9, .1
print(np.random.binomial(n, p, size=20))
[1 2 1 1 0 4 3 1 0 0 0 0 1 2 2 1 0 1 0 0]
模拟投硬币
两枚都是正面
n, p = 2, .5
sum(np.random.binomial(n, p, size=20000)==2)/20000.
0.24605
和我们的精确概率值相接近
其中一个为反面
sum(np.random.binomial(n, p, size=20000)==1)/20000.
0.5075
两个都是反面
n, p = 2, .5
sum(np.random.binomial(n, p, size=20000)==0)/20000.
0.257