概率基本概念
n(E):特定事件集合
n(S):样本空间
概率的范围如下所示:
P=0,表示事件不存在或不可能发生,如果P=1,表示事件一定会发生。
使用随机数函数randint(min,max),min=1,max=6,然后执行1000次,最后列出产生5的次数与概率 。
import random # 导入模块random
min = 1
max = 6
target = 5
n = 10000
counter = 0
for i in range(n):
if target == random.randint(min, max):
counter += 1
print('经过 {} 次, 得到 {} 次 {}'.format(n, counter, target))
P = counter / n
print('机率 P = {}'.format(P))
运行结果如下:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
经过 10000 次, 得到 1638 次 5
机率 P = 0.1638
[Done] exited with code=0 in 0.367 seconds
使用随机数产生10000次1、2、3、4、5、6的随机数,最后将结果建立直方图,同时列出每个点数的产生次数。
import matplotlib.pyplot as plt
from random import randint
min = 1
max = 6 # 骰子有几面
times = 10000 # 掷骰子次数
dice = [0] * 7 # 建立掷骰子的列表
for i in range(times):
data = randint(min, max)
dice[data] += 1
del dice[0] # 删除索引0数据
for i, c in enumerate(dice, 1):
print('{} = {} 次'.format(i, c))
x = [i for i in range(1, max+1)] # 直方图x轴坐标
width = 0.35 # 直方图宽度
plt.bar(x, dice, width, color='g') # 绘制直方图
plt.ylabel('Frequency')
plt.title('Test 10000 times')
plt.show()
运行结果如下:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
1 = 1659 次
2 = 1688 次
3 = 1672 次
4 = 1679 次
5 = 1674 次
6 = 1628 次
[Done] exited with code=0 in 12.478 seconds
数学概率与统计概率
统计概率使用下列公式表达:
事件概率名称
事件:
在样本中每个子集合,称事件。
必然事件:
在概率事件中一定会发生的事件称必然事件。
掷骰子的样本空间是{1,2,3,4,5,6},所掷的骰子点数一定是在1~6,所有这就是必然事件。
不可能事件:
在概率事件中一定不会发生的事件称不可能事件,也就是不可能发生的样本空间内的事件。不可能事件可以用表示,所以得到下列结果。
#所有不在样本空间内的事件,事件发生概率是0
掷骰子的样本空间是{1,2,3,4,5,6},所掷的骰子一定不会是0,所以这就是不可能事件。
余事件:
在掷骰子事件中,出现5的概率是,所谓余事件就是出现非5的其他事件,此时得到出现 非5的概率是。
互斥事件:
如果事件A与事件B产生下列情况,称A与B为互斥事件。
事件概率规则
不发生概率
其实这和余事件概念相同,假设事件A的发生概率是P(A),则事件A的不发生概率是:
相率相加
两个事件不会同时发生,或者说这两件事是独立事件。可将概率相加称和事件。
掷骰子时,如果要计算产生偶数{2,4,6}的概率,可以使用下列公式:
概率相乘
掷骰子时,连续出现5的概率是多少?
使用概率相乘就可以算出连续2次出现5的概率,参考下列公式:
常见的陷阱
省略
抽奖的概率:加法与乘法综合应用
公司要举办员工欧州旅游抽奖,有7支签,其中2支签是公司补助全额旅费。
第1位: 中奖 无
第2位: 中奖 无 中奖 无
如果第1位员工中奖,第2位员工也中奖,概率计算方式是使用概率相乘:
如果第1位员工没中奖,第2位员工中奖,概率计算方式也是使用概率相乘:
由于上述事件不会同时发生,所以执行加法运算:
Python内有fractions模块,可以执行分数的运算。
计算第2位员工的中奖概率。
from fractions import Fraction
x = Fraction(2, 7) * Fraction(1, 6)
y = Fraction(5, 7) * Fraction(2, 6)
p = x + y
print('第 1 位抽签的中奖机率 {}'.format(Fraction(2, 7)))
print('第 2 位抽签的中奖机率 {}'.format(p))
运行结果如下:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
第 1 位抽签的中奖机率 2/7
第 2 位抽签的中奖机率 2/7
[Done] exited with code=0 in 0.239 seconds
余事件与乘法的综合应用
连掷3次骰子,请问至少出现一次点数5的概率是多少?
(1)掷骰子不出现5的概率是。
(2)连掷3次骰子不出现5的概率是。
(3)连掷3次至少出现1次5的概率计算方式是采用余事件,概念如下:
P(至少出现1次5的概率)=1-P(不出现5的概率)
p=1-0.5787=0.4213
所以可以得到连掷3次骰子,至少出现一次点数5的概率是0.4213。
计算连掷3次骰子,至少出现一次点数5的概率。
from fractions import Fraction
x = Fraction(5, 6)
p = 1 - (x**3)
print('连掷骰子不出现 5 的机率 {}'.format(p))
print('连掷骰子不出现 5 的机率 {}'.format(float(p)))
运行结果如下:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
连掷骰子不出现 5 的机率 91/216
连掷骰子不出现 5 的机率 0.4212962962962963
[Done] exited with code=0 in 0.723 seconds
条件概率
P(A事件发生的概率)=P(A)
P(B事件发生的概率)=P(B)
P(A事件与B事件同时出现的概率)=P(AB)
P(已知A事件下,B事件出现的概率)=P(B|A)
P(已知B事件下,A事件出现的概率)=P(A|B)
当掷一颗六面骰子,样本空间是{1,2,3,4,5,6},假设情况如下:
A={5,6} #点数大于4的事件
B={1,3,5} #点数是奇数的事件
P(A|B)是在发生骰子点数是奇数时,出现点数大于4的概率;
P(B|A)是骰子点数大于4时,出现奇数的概率。
贝氏定理
基本概念
在条件概率的应用中有一个重要的定义称贝叶斯定理(Bayes' theorem),这是描述在已知条件下,某一事件发生的概率。基本概念是已知事件A的条件下发生事件B的概率,与已知事件B的条件下发生事件A的概率不一样,但是两者有关联,贝叶斯定理就是描述这个关系。
用实例验证贝叶斯定理
贝叶斯定理的运用:COVID-19的全民普筛准确性预估
省略
使用贝叶斯定理筛选垃圾电子邮件
省略
蒙地卡罗模拟
用蒙地卡罗模拟随机数计算Pi值,这个程序会产生100万个随机点。
import random
trials = 1000000
Hits = 0
for i in range(trials):
x = random.random() * 2 - 1 # x轴坐标
y = random.random() * 2 - 1 # y轴坐标
if x * x + y * y <= 1: # 判断是否在圆内
Hits += 1
PI = 4 * Hits / trials
print("PI = ", PI)
运行结果如下:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
PI = 3.142084
[Done] exited with code=0 in 1.489 seconds
使用matplotlib模块,如果点落在圆内绘黄色点,如果落在圆外绘绿色点,直接使用randint()方法产生随机数,同时将所绘制的图落在x=0~100,y=0~100的范围内。由于绘图会需要比较多时间,所以测试5000次。
import random
import math
import matplotlib.pyplot as plt
trials = 5000
Hits = 0
radius = 50
for i in range(trials):
x = random.randint(1, 100) # x轴坐标
y = random.randint(1, 100) # y轴坐标
if math.sqrt((x-50)**2 + (y-50)**2) < radius: # 在圆内
plt.scatter(x, y, marker='.', c='y')
Hits += 1
else:
plt.scatter(x, y, marker='.', c='g')
plt.axis('equal')
plt.show()
运行结果如下: