概率论1 计数-排列-组合

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

概率

概率论研究随机事件。它源于赌徒的研究。赌博中有许多随机事件,比如投掷一个骰子,是否只凭运气呢?

赌徒逐渐发现随机事件的规律。投掷两个骰子是常见的赌博游戏。如果重复很多次,那么总数为2的次数会比总数7的次数少。这就是赌徒把握到的规律:尽管我无法预知事件的具体结果,但我可以了解每种结果出现的可能性。这是概率论的核心。

“概率”到底是什么?这在数学上还有争议。“频率派”认为概率是重复尝试多次,某种结果出现的次数在尝试的总次数的比例。“贝叶斯派”认为概率是主观信念的强弱。幸好,这些争议并不影响我们在日常生活中使用“概率”哲学。天气预报的降雨概率为80%时,很多人会因此带上伞。报纸会分析一场球赛某支球队的赢球概率,如果最终赢球概率为10%的球队取胜,那么球迷会感到惊讶,这毕竟是小概率事件。

要知道某个结果的概率并不容易。上面分析球队的赢球概率,要考虑许多因素。投一个骰子,有6种可能的结果。许多原因会影响到结果,比如撒子是否均匀,比如掷撒子的人是否有技巧偏向。只有在骰子绝对均匀,且没有作弊,每种结果出现的概率才相同。否则的话,根本无法给结果一个确定的概率值。因此,为了能从数学上给结果分配一个概率,我们往往会给随机事件增加一些假设条件。这些条件有理想化的成份,但并不至于偏离现实。比如,我们说掷撒子,撒子均匀,掷的人也没有什么特殊手法,并由此推断每种结果出现的可能相同。那么,其中任意一个结果出现的概率为1/6。

基本计数原理

上面我们谈到了“等概率”的假设。如果每种结果出现的概率相同,那么给结果分配概率的任务就变得简单一些。在计算这种概率时,我们只需要等概率的结果的总数,就可以知道每种结果的概率。比如掷一个撒子会有6种结果,如果等概率,那么每个结果的概率为1/6。对于一些复杂的情况,就需要使用到计数技巧。

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

如果一个实验可以分为m个步骤,每个步骤分别有n1,n2,...,nmn1,n2,...,nm种可能,那么总共会有

n1×n2×...×nmn1×n2×...×nm

种可能的结果。

基本技术原理的核心是“分步”。对于简单的一个步骤的事情,我们能比较直接的分辨结果的总数。比如生一个孩子的性别,比如一个硬币的正反,比如一个撒子的结果。当一个随机事件是多个步骤复合而成的,而每个步骤又都是随机的,那么分布可以简化问题的复杂性。想像一个餐厅,有三个窗口,分别卖三种饮料,五种菜和两种主食。每个学生在每个窗口限选一种,那么学生的餐饮配套会有3x5x2共30种可能的结果。如果每个窗口的师傅都很随意霸道,随手给学生一样东西,那么我们甚至于可以假设等概率条件,每种餐饮拍套出现的概率为1/30。

(当然,作为学生,会抗议这样的“随机”食堂吧?)

基本计数原理的应用并不局限于概率论。在程序员进行算法分析时,无形中使用的就是进行计数。比如嵌套循环,外循环需要M步,内循环需要N步,那么总共进行操作的次数是MxN次。可以说,计数是“离散数学”非常重要的一个组成部分;而离散数学,正是计算机专业的核心数学课程。

基本计数原理是思考的起点。现实中的情况往往会更多变些。特别是当我们“分布”的动作都是作用于同一个群体时,会相对复杂。我们分类了解以下情形:

有序的重复抽样

考虑下面的两个问题:

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

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

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

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

nmnm

种可能。

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

import itertools

a = [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/36P=1/36。

有序的非重复抽样

考虑下面两个问题:

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

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

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

有序的非重复抽样又叫做排列(permutation)。从数学上来说,从n个样品中挑选m个,放入m个位置,将有

n×(n?1)×...×(n?m+1)n×(n?1)×...×(n?m+1)

种可能。如果我们使用阶乘(factorial)运算符,那么结果可以表示为

n!(n?m)!n!(n?m)!

其中,n!=1×2×...×(n?1)×nn!=1×2×...×(n?1)×n。

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

import itertools

a = ["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!m!种排列方式。如果是从n个样品中抽取m个作为组合,所有的这m!m!种排序方式应该看做一种。因此,有

n!(n?m)!m!n!(n?m)!m!

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

(nm)=n!(n?m)!m!(nm)=n!(n?m)!m!

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

import itertools

a = ["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个为一堆。可以证明,结果为

9!1!3!5!9!1!3!5!

类似的,将n个球分为n1,n2,...,nmn1,n2,...,nm个的堆,其中n=n1+n2+...+nmn=n1+n2+...+nm。将有

n!n1!n2!...nm!n!n1!n2!...nm!

种可能。

无序的重复抽样

证明

考虑下面的问题:

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

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

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

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

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

图片来源

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

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

(72)(72)

种可能。

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

(n+m?1m?1)(n+m?1m?1)

种可能。

阶乘与组合

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

import math
print(math.factorial(5))

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

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

练习

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

总结

基本计数原理

排列

组合

欢迎继续阅读“数据科学”系列文章

时间: 2024-08-25 06:30:03

概率论1 计数-排列-组合的相关文章

自然语言处理(NLP) - 数学基础(1) - 排列组合

正如我在<自然语言处理(NLP) - 数学基础(1) - 总述>一文中所提到的NLP所关联的概率论(Probability Theory)知识点是如此的多, 饭只能一口一口地吃了, 我们先开始最为大家熟知和最基础的知识点吧, 排列组合. 虽然排列组合这个知识点大家是相当地熟知, 也是相当地基础, 但是却是十分十分十分地重要. NLP届掌门人斯坦福大学的Daniel Jurafsky(D. 朱夫斯凯)和科罗拉多大学James H. Martin(J. H. 马丁)在其NLP巨作<自然语言处

【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一位同学的一门必修课分数不同时视为两种情况不同.n,m<=100,Ui<=10^9. [算法]计数DP+排列组合+拉格朗日插值 [题解]把分数作为状态不现实,只能逐门课考虑. 设$f[i][j]$表示前i门课,有j个同学被碾压的情况数,则有: $$f[i][j]=g(i)\cdot\sum_{k=j

HDU--5396(区间dp+排列组合)

做这道题的时候,想到会不会是dp,然后发现dp可做,但是一直被自己坑到死. 枚举最后合并的那个位置,然后对于加减号的,分成的前后两个部分都有不同的组合方法, (a1+a2........) +  (b1,b2.............)         对于每个a,被加b的个数的阶乘次 ,对于每个b,被加a的个数的阶乘次 减法同理 乘法特殊一点 (a1+a2........) *  (b1,b2.............)  乘法分配率,直接将两部分的总和相乘即可 想到这些还远远没有结束,因为最

TODO:排列组合问题:n个数中取m个

排列组合是组合学最基本的概念.所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序.组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序.排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数. 排列组合与古典概率论关系密切. 本文示例实现的功能是"按顺序"从n个数中取m个数,如1,2,3,4,5,6取5个数字是:1,2,3,4,5:1,2,3,4,6:2,3,4,5,6.示例代码有javascript,php,golang,如果雷同,纯属学术研究,作为一种记

高中数学排列组合

一.特殊元素和特殊位置优先策略 例1.由0,1,2,3,4,5可以组成多少个没有重复数字五位奇数. 解:由于末位和首位有特殊要求,应该优先安排,以免不合要求的元素占了这两个位置. 先排末位共有 然后排首位共有 最后排其它位置共有 由分步计数原理得 二.相邻元素捆绑策略 例2. 7人站成一排 ,其中甲乙相邻且丙丁相邻, 共有多少种不同的排法. 解:可先将甲乙两元素捆绑成整体并看成一个复合元素,同时丙丁也看成一个复合元素,再与其它元素进行排列,同时对相邻元素内部进行自排.由分步计数原理可得共有种不同

【程序员眼中的统计学(5)】排列组合:排序、排位、排

排列组合:排序.排位.排 作者 白宁超 2015年10月15日18:30:07 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理.首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集.诚然在传统学科中,其在以上学科发挥作用很大.然而随着科学技术的发展和机器智能的普及,统计学在机器智能中的作用越来越重要.本系列统计学的学习基于<深入浅出统计学>一书(偏向代码实现,需要读者有一定基础,可以参见后面PPT学习).正如(吴军)先生在<数学之美>一书中阐述的,基于统

【Java中 任意几个数字获取其所有的排列组合】

今天在工作中碰到一个问题,在java中输入比如1,2,3  三个数 我想要得到其所有的排列组合 比如 123,312,132,231,213,321 这些 上网找了找别人的算法,稍加整理,分享给大家代码如下 import java.util.Arrays;                        //用于数组输出. import java.util.LinkedList; import java.util.List; public class test { static String to

洛谷P1246编码问题-排列组合,分类讨论

编码问题 题意就是a,b,c.....ab.....编码,给你一个字符串,输出这是第几个: 这里可以用暴力枚举,但也可以用组合数学的高超知识: 既然这样我就说一下排列组合的方法,如果要弄一个 各位数字递增的三位数,只需要在一个有序数列里面取三个数字,此时就无需关注顺序,因为顺序只能是升序的.比如0 1 2 3 4 5 6 7 8 9.取得9 5 8 那么他的顺序就只能是589.总数就是C(x,y),x代表位数,y代表可供选择的数的长度, 就像例子中是c(3,10).对于字母排列,道理也是一样.只

排列组合

(常考)错位排列 有N封信和N个信封,每封信都不装在自己信封里的排列种数记作Dn,则 D1=0,D2=1,D3=2,D4=9,D5=44,D6=265 一.相邻问题---捆绑法 不邻问题---插空法 对于某几个元素不相邻的排列问题,可先将其他元素排好,再将不相邻元素在已排好的元素之间及两端空隙中插入即可. [例题1]一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添进去2个新节目,有多少种安排方法? A.20 B.12 C.6 D.4 [答案]A. [解析] 以下内容需要回复才能看