概率论01 计数

来源:互联网 发布:java 线程interrupt 编辑:程序博客网 时间:2024/06/06 03:46

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

概率论主要研究随机或者说不确定事件。它最早产生于赌徒对赌博结果的研究 (即使是今天,概率论也经常用于赌博)。在概率论中,我们往往想要知道一个事件的概率。比如,我们投一个骰子,出现1点的概率。在这种情况下,有6种可能的结果。如果骰子是均匀的,且没有作弊,那么每种结果出现的概率相同。在等概率的条件下,其中一个结果出现的概率为1/6。

 

在计算概率的时候,我们有时需要计算可能的结果的总数,这就需要使用到计数。如果每种结果是等概率的,那么每个结果出现的概率就可以很容易的计算出来。

 

基本计数原理

计数的基本原理叙述如下:

如果一个实验可以分为m个步骤,每个步骤分别有[$n_1, n_2, ..., n_m$]种可能,那么总共会有

$$n_1 \times n_2 \times ... \times n_m$$

种可能的结果。

 

利用基本计数原理,我们可以分类了解以下情形:

 

有序的重复抽样

考虑下面的两个问题:

  • 一个骰子连续掷2次,所有可能的结果有多少个?
  • 一个彩票可选6个号,每个号可以是0到9,共有多少个可能的结果?

我们可以看到,这一类的抽样结果是由多次抽样构成的。每次抽样的样本,在下一次也可能出现。比如骰子第一次为1,第二次还可能为1。这叫做重复抽样 (或者说有放回的抽样,sampling with replacement)。在骰子的例子中,每次抽样的可能出现的结果都有6种。

样本出现的次序影响结果。比如[$(1, 2)$]和[$(2, 1)$]是两个不同结果。

 

从数学上来说,如果进行m次有放回的抽样,每次抽样都有n种可能。如果最终结果有序,那么将有

$$n^m$$

种可能。

 

我们下面模拟骰子的例子:

import itertoolsa = [1, 2, 3, 4, 5, 6]outcomes = list(itertools.product(a, a))print(outcomes)print(len(outcomes))

共返回36个可能的结果:

[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), 
(2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6),
(3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6),
(4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6),
(5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6),
(6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]36

如果每种结果的出现概率相同,那么对于其中的某个具体结果来说,它出现的概率[$P=1/36$]。

 

有序的非重复抽样

考虑下面两个问题:

  • 从4个人中,挑出2个人分别担任队长和副队长,有多少种可能?
  • 从10们课种,挑选3们,分别放入周一、周三、周五的课表,有多少种可能?

 

可以看到,这样的抽样是没有重复的。某一次抽样的样本在此后不会出现。这叫做非重复抽样。在非重复的前提下,每次抽样可能的结果数递减,比如从4个人中选一个作为队长,那么副队长只能从3个人中选择。

同样,结果是有序的。A担任队长,B担任副队长,与A担任副队长,B担任队长,是两个不同结果。

 

有序的非重复抽样又叫做排列(permutation)。从数学上来说,从n个样品中挑选m个,放入m个位置,将有$$n\times(n-1)\times...\times(n-m+1)$$种可能。如果我们使用阶乘(factorial)运算符,那么结果可以表示为

$$\frac{n!}{(n-m)!}$$

其中,[$n!=1\times2\times...\times(n-1)\times n$]。

 

我们用下面的程序来模拟队长组合的状况:

import itertoolsa = ["Tom", "Lee", "King", "James"]outcomes = list(itertools.permutations(a, 2))print(outcomes)print(len(outcomes))

 

结果为

[('Tom', 'Lee'), ('Tom', 'King'), ('Tom', 'James'), 
('Lee', 'Tom'), ('Lee', 'King'), ('Lee', 'James'),
('King', 'Tom'), ('King', 'Lee'), ('King', 'James'),
('James', 'Tom'), ('James', 'Lee'), ('James', 'King')]

 

共有12种可能的结果。

 

无序的非重复抽样

考虑下面的问题:

  • 从4个人中抽出2个人,有多少种可能?
  • 从一副扑克中抽3张牌,有多少种可能?

 

在上面的问题中,每次抽样同样是非重复的。但这里,抽样结果是无序的。比如说,抽出"Lee"和"Tom",以及抽出"Tom"和"Lee",是同一个结果。这样的抽样方式叫做组合(combination)。

 

m个样品有[$m!$]种排列方式。如果是从n个样品中抽取m个作为组合,所有的这[$m!$]种排序方式应该看做一种。因此,有

$$\frac{n!}{(n-m)!m!}$$

种可能结果。我们可以用下面的方式记录组合:

$$\left( \begin{array}{c} n \\ m \end{array} \right) = \frac{n!}{(n-m)!m!}$$

 

我们下面来模拟第一个问题:

import itertoolsa = ["Tom", "Lee", "King", "James"]outcomes = list(itertools.combinations(a, 2))print(outcomes)print(len(outcomes))

有以下结果

 

[('Tom', 'Lee'), ('Tom', 'King'), ('Tom', 'James'), ('Lee', 'King'), ('Lee', 'James'),  ('King', 'James')]

可以看到,从4个中挑选2个,有6种可能的组合。这是排列的一半。

 

组合的问题可以进一步延伸。比如,将9个球分为1, 3, 5个的三堆,有多少种方式?这相当于从9个球中抽取1个,再从剩下的8个球中抽取3个,最后剩下的5个为一堆。可以证明,结果为

$$\frac{9!}{1!3!5!}$$

类似的,将n个球分为[$n_1, n_2, ... , n_m$]个的堆,其中[$n=n_1 + n_2 + ... + n_m$]。将有

$$\frac{n!}{n_1!n_2!...n_m!}$$

种可能。

 

无序的重复抽样

考虑下面的问题:

  • 刮奖彩票有4种奖品。购买3张彩票的话,有多少种中奖可能?

 

在上面的每次抽样中,都是重复抽样,即抽出后有放回。比如刮奖中,可以多次刮到同一奖品。我们在一个表中记录结果:

  台灯 手表 电脑 汽车 可能1 3 0 0 0 可能2 2 0 1 0 可能3 0 1 1 1

可以看到,我们实际上是将3张彩票分成4份,每份的数目不定[$( \geq0 )$]。

 

这与下面的问题类似,将5个相同物品放入三个不同的容器中:

图片来源

 

我们用2个黑色分隔物,来将5个相同的物品分为3堆。比如这里,将物品分为(0, 2, 3)的结果。

从7个位置中挑选2个作为分割物的位置,共有

$$\left( \begin{array}{c} 7 \\ 2 \end{array} \right)$$

种可能。

 

概括来讲,从n个样品中,无序的重复抽样m次,有

$$\left( \begin{array}{c} {n + m - 1} \\ {m - 1} \end{array} \right)$$

种可能。

 

阶乘与组合

我们在上面多次使用了阶乘运算,在Python中,它可以使用math.factorial实现:

import mathprint(math.factorial(5))

 

此外,组合可以使用scipy.misc.comb来近似计算,比如:

import scipy.miscprint(scipy.misc.comb(4, 2))

 

练习

每一部分都提出了两个问题,思考第二个问题的结果。

 

总结

基本计数原理

排列

组合

 

 


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击