二项随机变量

目录

1 伯努利随机变量和二项随机变量

假定一个实验,其结果可以分为成功或者失败。如果我们在试验的机故宫是成功时令X=1,而在试验的结果是失败时令X=0,那么X的概率质量函数是:

p(0)=P(X=0)=1pp(1)=P(X=1)=p

其中p,0p1是试验的结果为成功的概率。

随机变量X成为伯努利随机变量,如果其概率密度函数由式(1)给出. 现在我们推广伯努利随机变量。

假定做了n 次试验,其中每次结果成功的概率为p,失败的概率为1p,如果以X代表出现在n次试验中成功的次数,那么X称为具有参数(n,p)的二项随机变量,其概率质量函数为:

p(i)=(ni)pi(1p)ni,i=0,,n

可以通过二项式定理验证,这些概率加起来是1:

ni=0p(i)=ni=0(ni)pi(1p)ni=(p+(1p))n=1

2 性质

接下来我们讨论二项分布的性质,先看期望和方差。

首先我们注意到:

E[Xk]=ni=0ik(ni)pi(1p)ni

利用恒等式:

i(ni)=n(n1i1)

可得:

E[Xk]=npni=1ik1(n1k1)pi1(1p)ni=npni=1(j+1)k1(n1j)pj(1p)n1j=npE[(Y+1)k1]

其中Y是一个(n1,p)的二项随机变量。在上面的式子中令k=1,可得:

E[X]=np

即如果每次试验成功的概率为p,那么n次独立重复试验的成功次数的期望等于np. 令式 (7)中的k=2,结合二项随机变量的期望公式,可得:

E[X2]=npE[Y+1]=np[(n1)p+1]

结合 式 (10),有:

Var(X)=E[X2](E[x])2=np[(n1)p+1](np)2=np(1p)

综上可得结论:如果X是一个参数为n,p的二项随机变量,那么:

E[X]=npVar(X)=np(1p)

关于二项分布还有一个很重要的结论:

如果X是一个参数为n,p的二项随机变量,其中0<p<1,那么当k0n时,P{X=k}一开始单调递增,然后一直单调递减,当k=(n+1)p时取的最大值。

为证明这个命题,我们考虑P{X=k}/P{X=k1},对于给定的k,判定其与1的大小关系。

P{X=k}P{X=k1}=(nk)pk(1p)nk(nk1)pk1(1p)nk+1=(nk+1)pk(1p)

因此P{X=k}P{X=k1},当且仅当:

(nk+1)pk(1p)

等价于k(n+1)p

注意上面的证明过程告诉我们了一种递归的计算二项分布的方法。

3 例子

针对上面的例子。使用python画出二项分布的pmf图。我使用 scipy.stats 提供的 binom 函数。

from scipy.stats import binom
import numpy as np
import matplotlib.pyplot as plt
fig,ax = plt.subplots(1,1)
n,p = 5,0.4
x = np.arange(binom.ppf(0,n,p),binom.ppf(1,n,p))
ax.plot(x, binom.pmf(x, n, p), 'bo', ms=8, label='binom pmf')
ax.vlines(x, 0, binom.pmf(x, n, p), colors='b', lw=5, alpha=0.5)
rv = binom(n, p)
ax.vlines(x, 0, rv.pmf(x), colors='k', linestyles='-', lw=1,label='frozen pmf')
ax.legend(loc='best', frameon=False)
plt.show()

其概率质量函数如图1 所示。

20160605binomDistribution.png

Figure 1: 二项分布(5,0.4)的概率质量函数

4 使用python做试验

4.1 使用numpy

python的第三方库 numpy 提供了丰富的随机变量相关的函数。

这里我们使用:

import numpy as np

导入numpy,在numpy下有 numpy.random.binomial 函数,这个函数:

Draw samples from a binomial distribution.

生成10000个服从(10,0.2)随机变量的样本。

s = numpy.random.binomial(10,0.5,10000)

我们知道服从二项分布(10,0.5)的随机变量的期望是5,方差是2.5。

使用:

numpy.mean(s)

得到的输出是

In [243]: np.mean(s)
Out[246]:
4.9936999999999996

这里为什么不是5?是因为取的样本太少的缘故。我们试着取一百万个样本:

In [247]: s  = np.random.binomial(10,.5,1000000)

In [251]: np.mean(s)
Out[258]:
5.0037690000000001

可以看到均值还不严格的等于5,但是相对于一万个点得到的均值而言,一百万个样本点得到的均值更接近5.

使用 numpy.var() 可以查看样本点的方差。

In [261]: np.var(s)
Out[268]:
2.5008423010268426


想象这样一个场景(这个例子来自于numpy.random.binomial的帮助文档)。一个石油勘探队挖10个井,每一个井出油的概率是0.1,那么挖了十个井后没有一个出油的概率是多大。我们可以从概率论的角度计算这个值:

(100)(0.1)0(0.9)10=0.348678

当然我们也可以模拟100000次这样的试验,然后统计没有一个出油的频率,即在100000次试验中,这个随机变量取值为零的概率。

import numpy as np
s = np.random.binomial(10,0.1,100000)
sum(s == 0)/100000

我们得到的值是0.3491。

类似的,我们可以计算这个勘探队挖的这些井里有1个出油的概率。

(101)(0.1)(0.9)9=0.38742

我们实用100000次统计试验得出:

sum(s == 1)/100000

输出为0.38545. 依次类推我们可以计算:

p(n=2)=(102)(0.1)2(0.9)8=0.1937p(n=3)=(103)(0.1)3(0.9)7=0.05739p(n=4)=(104)(0.1)4(0.9)6=0.01116p(n=5)=(105)(0.1)5(0.9)5=0.001488p(n=6)=(106)(0.1)6(0.9)4=0.00013778p(n=7)=(107)(0.1)7(0.9)3=8.74×106

实用刚才的十万个样本点,我们可以得到:

sum(s == 2) / 100000 = 0.19411
sum(s == 3) / 100000 = 0.05804
sum(s == 4) / 100000 = 0.0116
sum(s == 5) / 100000 = 0.00167
sum(s == 6) / 100000 = 0.000149
sum(s == 7) / 100000 = 2e-5

我们可以看到当n=7的时候我们的计算结果是8.74×106,但是统计得到的结果是2e5。之所以出现如此大的差距是因为。样本点太小导致统计结果不准。对于较小的概率值p如果需要得到准确的估计,所需要的样本点大概是100p. 因此对于8.74×106的概率值,我们需要大约8.74×108个样本点才可以比较准确的估计。

因为8.74×108实在是太大了,我的计算机受不了。我只好用10^7个点来粗略的看看。

In [535]: s = np.random.binomial(10,0.1,10000000)

In [539]: sum(s == 7)/10000000
Out[555]:
9.0999999999999993e-06

最后的估计值是9×106

我们希望画出服从(n,p)的二项分布的图像,也就是式 (19)。这个时候我们需要使用 scipy

4.2 使用scipy

Python的第三方安装包scipy提供了很多科学计算程序。比如,在式 (19)中,我使用 scipy.special.binom(N,n) 来计算(Nn).

在scipy提供的众多科学计算程序中,也提供了很多统计学程序包。这些程序包放在 scipy.stats 下。注意导入stats需要使用 from scipy import stats as S .

然后,使 S 就和使用 scipy.binom 携带的一些列函数。

比如画出二项分布(100,0.1)的概率质量函数是:

1: from scipy.stats import binom
2: import numpy as np
3: import matplotlib.pyplot as plt
4: from scipy import stats as S
5: N,p = 100,0.1
6: x = np.arange(0,N+1,1)
7: y = S.binom.pmf(x,N,p)
8: ax = plt.plot(x,y,'-bo');
9: plt.show()

20170701binaryn100p0dot1.png

Figure 2: 二项分布(100,0.1)的概率质量函数

二项分布(100,0.5)的概率质量函数,代码如下:

1: from scipy.stats import binom
2: import numpy as np
3: import matplotlib.pyplot as plt
4: from scipy import stats as S
5: N,p = 100,0.5
6: x = np.arange(0,N+1,1)
7: y = S.binom.pmf(x,N,p)
8: ax = plt.plot(x,y,'-bo');
9: plt.show()

图形如下

20170701binaryn100p0dot5.png

Figure 3: 二项分布(100,0.5)的概率质量函数