1. numpy数组的按元素计算
设完备事件组
A
1
,
A
2
,
⋯
,
A
n
A_1,A_2,\cdots,A_n
A1,A2,⋯,An作为引发事件
B
B
B的
n
n
n个因素。诸因素的先验概率构成的序列为
P
(
A
1
)
,
P
(
A
2
)
,
⋯
,
P
(
A
n
)
P(A_1),P(A_2),\cdots,P(A_n)
P(A1),P(A2),⋯,P(An),在诸因素
A
i
A_i
Ai发生的条件下,事件
B
B
B的似然度构成序列
P
(
B
∣
A
1
)
,
P
(
B
∣
A
2
)
,
⋯
,
P
(
B
∣
A
n
)
P(B|A_1),P(B|A_2),\cdots,P(B|A_n)
P(B∣A1),P(B∣A2),⋯,P(B∣An),这两个序列是等长(所含元素个数相同)的。序列对应元素积之和
∑
i
=
1
n
P
(
A
i
)
P
(
B
∣
A
i
)
\sum\limits_{i=1}^nP(A_i)P(B|A_i)
i=1∑nP(Ai)P(B∣Ai),即为用全概率公式计算的事件
B
B
B的概率
P
(
B
)
P(B)
P(B)。Python的numpy包提供的数组array类的两个等长(所含元素个数相同)对象之间就支持这样的“按元素”运算:对应元素分别计算,得到一个新的数组(如图所示)。
运算包括常见的加+、减-、乘*、除/、幂**以及各种函数计算。例如以下代码示例了等长数组间的四则运算:
import numpy as np
x=np.array([2, 3, 4])
y=np.array([1, 2, 3])
print(x+y)
print(x-y)
print(x*y)
print(x/y)
运行程序,输出
[3 5 7]
[1 1 1]
[ 2 6 12]
[2. 1.5 1.33333333]
2. 全概率公式计算
利用numpy的这一技术,将计算全概率公式的算法表示成如下的函数定义:
def totalProb(prioProbs, likelihood): #参数类型为np.array
return (prioProbs*likelihood).sum() #按元素乘法然后求和
上列程序定义了计算全概率公式的函数totalProb,该函数有两个numpy数组类型的参数:表示完备组先验概率序列的prioProb和表示似然度序列的likelihood。函数计算先验概率序列prioProb和似然度序列likelihood按元素的积(prioProbs*likelihood),然后调用该数组的sum方法对所得序列求和((prioProbs*likelihood).sum()),最后将所得值作为返回值返回(第2行)。
例1 设某仓库有一批产品,已知其中甲、乙、丙三个工厂生产的产品依次占
50
%
50\%
50%,
30
%
30\%
30%和
20
%
20\%
20%,且甲、乙、丙厂的次品率分别为
1
/
10
1/10
1/10,
1
/
15
1/15
1/15和
1
/
20
1/20
1/20。现从这批产品中任取一件,求取得正品的概率。\
解:设事件“从仓库中任取一件产品是正品”为
B
B
B。
A
1
,
A
2
,
A
3
A_1, A_2, A_3
A1,A2,A3分别表示事件:“产品是甲、乙、丙厂生产的”,则
A
1
,
A
2
,
A
3
A_1, A_2, A_3
A1,A2,A3构成一个完备事件组,可视为事件
B
B
B发生的3个因素。按题设
P
(
A
1
)
=
1
/
2
P(A_1)=1/2
P(A1)=1/2,
P
(
A
2
)
=
3
/
10
P(A_2)=3/10
P(A2)=3/10,
P
(
A
3
)
=
1
/
5
P(A_3)=1/5
P(A3)=1/5(各因素的前验概率),且由
P
(
B
ˉ
∣
A
1
)
=
1
/
10
P(\bar{B}|A_1)=1/10
P(Bˉ∣A1)=1/10,
P
(
B
ˉ
∣
A
2
)
=
1
/
15
P(\bar{B}|A_2)=1/15
P(Bˉ∣A2)=1/15,
P
(
B
ˉ
∣
A
3
)
=
1
/
20
P(\bar{B}|A_3)=1/20
P(Bˉ∣A3)=1/20,得
P
(
B
∣
A
1
)
=
9
/
10
P(B|A_1)=9/10
P(B∣A1)=9/10,
P
(
B
∣
A
2
)
=
14
/
15
P(B|A_2)=14/15
P(B∣A2)=14/15及
P
(
B
∣
A
3
)
=
19
/
20
P(B|A_3)=19/20
P(B∣A3)=19/20(B相对于各因素的似然率)。
运用全概率公式计算事件“从仓库中任取一件产品是正品”的概率
P
(
B
)
P(B)
P(B),实际上就是将各因素的先验概率序列
[
P
(
A
1
)
,
P
(
A
2
)
,
P
(
A
3
)
]
[P(A_1), P(A_2), P(A_3)]
[P(A1),P(A2),P(A3)]与似然率序列
[
P
(
B
∣
A
1
)
,
P
(
B
∣
A
2
)
,
P
(
B
∣
A
3
)
]
[P(B|A_1), P(B|A_2), P(B|A_3)]
[P(B∣A1),P(B∣A2),P(B∣A3)]逐元素相乘,然后求和而得:
P
(
B
)
=
P
(
A
1
)
P
(
B
∣
A
1
)
+
P
(
A
2
)
P
(
B
∣
A
2
)
+
P
(
A
3
)
P
(
B
∣
A
3
)
=
1
2
⋅
9
10
+
3
10
⋅
14
15
+
1
5
⋅
19
20
=
23
/
25.
P(B)=P(A_1)P(B|A_1)+P(A_2)P(B|A_2)+P(A_3)P(B|A_3)\\=\frac{1}{2}\cdot\frac{9}{10}+\frac{3}{10}\cdot\frac{14}{15}+\frac{1}{5}\cdot\frac{19}{20}=23/25.
P(B)=P(A1)P(B∣A1)+P(A2)P(B∣A2)+P(A3)P(B∣A3)=21⋅109+103⋅1514+51⋅2019=23/25.
下列程序验算本例。
import numpy as np #导入numpy
from sympy import Rational as R #导入Rational类
prioProb=np.array([R(1,2), R(3,10), R(1,5)])
likelihood=np.array([R(9,10), R(14,15), R(19,20)])
p=totalProb(prioProb, likelihood)
print('P(B)=%s'%p)
第3、4行分别将 A 1 , A 2 , A 3 A_1,A_2,A_3 A1,A2,A3的先验概率序列 { 1 / 2 , 3 / 10 , 1 / 5 } \{1/2,3/10,1/5\} {1/2,3/10,1/5}和对 B B B的似然度序列 { 9 / 10 , 14 / 15 , 19 / 20 } \{9/10,14/15,19/20\} {9/10,14/15,19/20}分别设置为numpy(第1行导入)的array类数组prioProbs和likelihood。第5行调用函数totalProb,传递参数prioProb和likelihood,返回值赋予p。第7行输出计算结果:
P(B)=23/25