根据完备事件组
A
1
,
A
2
,
…
,
A
n
A_1, A_2,\dots , A_n
A1,A2,…,An的先验概率序列
P
(
A
1
)
,
P
(
A
2
)
,
…
,
P
(
A
n
)
P(A_1), P(A_2), \dots, P(A_n)
P(A1),P(A2),…,P(An),对事件
B
B
B的似然度序列
P
(
B
∣
A
1
)
,
P
(
B
∣
A
2
)
,
…
,
P
(
B
∣
A
n
)
P(B|A_1),P(B|A_2),…,P(B|A_n)
P(B∣A1),P(B∣A2),…,P(B∣An),计算第
i
i
i个因素
A
i
A_i
Ai的后验概率
P
(
A
i
∣
B
)
P(A_i|B)
P(Ai∣B),利用贝叶斯公式
P
(
A
i
∣
B
)
=
P
(
A
i
)
P
(
B
∣
A
i
)
∑
i
=
1
n
P
(
A
i
)
P
(
B
∣
A
i
)
P(A_i|B)=\frac{P(A_i )P(B|A_i)}{\sum_{i=1}^nP(A_i)P(B|A_i)}
P(Ai∣B)=∑i=1nP(Ai)P(B∣Ai)P(Ai)P(B∣Ai)
可以先算得中间序列
P
(
A
1
)
P
(
B
∣
A
1
)
,
P
(
A
2
)
P
(
B
∣
A
2
)
,
…
,
P
(
A
n
)
P
(
B
∣
A
n
)
P(A_1)P(B|A_1),P(A_2)P(B|A_2),\dots,P(A_n)P(B|A_n)
P(A1)P(B∣A1),P(A2)P(B∣A2),…,P(An)P(B∣An),贝叶斯公式中的分母就是该序列的和(即全概率公式的计算结果),分子是该序列中的第
i
i
i个元素。两者之商就是
P
(
A
i
∣
B
)
P(A_i|B)
P(Ai∣B),即
A
i
A_i
Ai的后验概率。实现这一算法的Python函数定义如下:
def bayes(prioProb, liklihood, i): #计算第i个因素Ai相对B的后验概率
temp=prioProb*liklihood #因素先验概率与对B的似然率按元素相乘
total=temp.sum() #B的先验概率
return temp[i-1]/total #Ai相对于B的后验概率
第1~4行定义函数bayes。该函数有3个参数,prioProb和likelihood与计算全概率公式的函数totalProb(定义见博文《全概率公式》)的同名参数一样,表示完备事件组
A
1
,
A
2
,
⋯
,
A
n
A_1,A_2,\cdots,A_n
A1,A2,⋯,An中各事件的先验概率序列
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)和对事件
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表示所要计算的是第
i
i
i个事件
A
i
A_i
Ai相对于
B
B
B的后验概率
P
(
A
i
∣
B
)
P(A_i|B)
P(Ai∣B)。第2行按元素将prioProb和likelihood相乘,得到序列
P
(
A
1
)
P
(
B
∣
A
1
)
,
P
(
A
2
)
P
(
B
∣
A
2
)
,
⋯
,
P
(
A
n
)
P
(
B
∣
A
n
)
P(A_1)P(B|A_1),P(A_2)P(B|A_2),\cdots,P(A_n)P(B|A_n)
P(A1)P(B∣A1),P(A2)P(B∣A2),⋯,P(An)P(B∣An),存于temp。第3行调用temp的求和函数sum按全概率公式计算
B
B
B的先验概率
P
(
B
)
P(B)
P(B),存于total。由于numpy的array类数组元素下标是从0开始起算的,故
P
(
A
i
)
P
(
B
∣
A
i
)
P(A_i)P(B|A_i)
P(Ai)P(B∣Ai)存储为temp[i-1],第4行将其与total之商,即
P
(
A
i
∣
B
)
=
P
(
A
i
)
P
(
B
∣
A
i
)
/
P
(
B
)
P(A_i|B)=P(A_i)P(B|A_i)/P(B)
P(Ai∣B)=P(Ai)P(B∣Ai)/P(B)作为返回值返回。
例1 根据临床记录,某种诊断癌症的试验具有如下的效果:若以
A
A
A表示事件“试验反应为阳性”,以
C
C
C表示事件“被诊断者患有癌症”,则有
P
(
A
∣
C
)
=
19
/
20
P(A|C)=19/20
P(A∣C)=19/20,
P
(
A
ˉ
∣
C
‾
)
=
19
/
20
P(\bar{A}|\overline{C})=19/20
P(Aˉ∣C)=19/20。今对自然人群进行普查,设被试验的人患有癌症的概率
P
(
C
)
=
1
/
200
P(C)=1/200
P(C)=1/200,试求
P
(
C
∣
A
)
P(C|A)
P(C∣A)。
解:在本例中,一个人试验反应是阳性(事件
A
A
A)无非是因为此人本身患有癌症(事件
C
C
C,此时为确诊),或没有患癌症(
C
‾
\overline{C}
C,此时为误诊)。因此,完备事件组
C
C
C和
C
ˉ
\bar{C}
Cˉ可视为是促成事件
A
A
A发生的因素。 根据题设,
P
(
C
)
=
1
/
200
P(C)=1/200
P(C)=1/200,则
P
(
C
‾
)
=
199
/
200
P(\overline{C})=199/200
P(C)=199/200。由
P
(
A
∣
C
)
=
P
(
A
‾
∣
C
‾
)
=
19
/
20
P(A|C)=P(\overline{A}|\overline{C})=19/20
P(A∣C)=P(A∣C)=19/20,可得
P
(
A
∣
C
‾
)
=
1
−
P
(
A
∣
C
)
=
1
/
20
P(A|\overline{C})=1-P(A|C)=1/20
P(A∣C)=1−P(A∣C)=1/20。
P
(
A
)
=
P
(
C
)
P
(
A
∣
C
)
+
P
(
C
‾
)
P
(
A
∣
C
‾
)
=
1
200
⋅
19
20
+
199
200
⋅
1
20
=
109
2000
.
P(A)=P(C)P(A|C)+P(\overline{C}) P(A|\overline{C})=\frac{1}{200}\cdot \frac{19}{20}+\frac{199}{200}\cdot\frac{1}{20}=\frac{109}{2000}.
P(A)=P(C)P(A∣C)+P(C)P(A∣C)=2001⋅2019+200199⋅201=2000109.
由于所求
P
(
C
∣
A
)
P(C|A)
P(C∣A)为后验概率,故运用贝叶斯公式计算
P
(
C
∣
A
)
=
P
(
C
)
P
(
A
∣
C
)
P
(
C
)
P
(
A
∣
C
)
+
P
(
C
‾
)
P
(
A
∣
C
‾
)
=
19
218
.
P(C|A)=\frac{P(C)P(A|C)}{P(C)P(A|C)+P(\overline{C})P(A|\overline{C})}=\frac{19}{218}.
P(C∣A)=P(C)P(A∣C)+P(C)P(A∣C)P(C)P(A∣C)=21819.
下列代码验算此结果。
import numpy as np #导入numpy
from sympy import Rational as R #导入Rational
prioProb=np.array([R(1,200),R(199,200)])
likelihood=np.array([R(19,20), R(1, 20)])
p=bayes(prioProb,likelihood, 1)
print('P(C|A)=%s'%p)
运行程序,输出
P(C|A)=19/218
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好。
返回《导引》