概率统计Python计算:贝叶斯公式

在这里插入图片描述
根据完备事件组 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(BA1)P(BA2)P(BAn),计算第 i i i个因素 A i A_i Ai的后验概率 P ( A i ∣ B ) P(A_i|B) P(AiB),利用贝叶斯公式
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(AiB)=i=1nP(Ai)P(BAi)P(Ai)P(BAi)
可以先算得中间序列 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(BA1),P(A2)P(BA2),,P(An)P(BAn),贝叶斯公式中的分母就是该序列的和(即全概率公式的计算结果),分子是该序列中的第 i i i个元素。两者之商就是 P ( A i ∣ B ) P(A_i|B) P(AiB),即 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(BA1),P(BA2),,P(BAn)。参数i表示所要计算的是第 i i i个事件 A i A_i Ai相对于 B B B的后验概率 P ( A i ∣ B ) P(A_i|B) P(AiB)。第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(BA1),P(A2)P(BA2),,P(An)P(BAn),存于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(BAi)存储为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(AiB)=P(Ai)P(BAi)/P(B)作为返回值返回。
例1 根据临床记录,某种诊断癌症的试验具有如下的效果:若以 A A A表示事件“试验反应为阳性”,以 C C C表示事件“被诊断者患有癌症”,则有 P ( A ∣ C ) = 19 / 20 P(A|C)=19/20 P(AC)=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(CA)
:在本例中,一个人试验反应是阳性(事件 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(AC)=P(AC)=19/20,可得 P ( A ∣ C ‾ ) = 1 − P ( A ∣ C ) = 1 / 20 P(A|\overline{C})=1-P(A|C)=1/20 P(AC)=1P(AC)=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(AC)+P(C)P(AC)=20012019+200199201=2000109.
由于所求 P ( C ∣ A ) P(C|A) P(CA)为后验概率,故运用贝叶斯公式计算
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(CA)=P(C)P(AC)+P(C)P(AC)P(C)P(AC)=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学,读正版书好
返回《导引》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值