概率统计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

写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
返回《导引》

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 贝叶斯公式是一种用于计算概率的公式,它可以帮助我们在给定一些条件的情况下,计算某个事件发生的概率贝叶斯公式的一般形式如下: P(A|B) = P(B|A) * P(A) / P(B) 其中,P(A|B) 表示在 B 已知的情况下,A 发生的概率,P(B|A) 表示在 A 已知的情况下,B 发生的概率,P(A) 表示 A 发生的概率,P(B) 表示 B 发生的概率。 下面是一个使用贝叶斯公式计算概率的示例代码: ```python # 计算 A 和 B 两个事件发生的概率 P_A = 0.3 # A 发生的概率 P_B = 0.4 # B 发生的概率 # 计算在 B 已知的情况下,A 发生的概率 P_B_given_A = 0.6 # 在 A 已知的情况下,B 发生的概率 P_A_given_B = P_B_given_A * P_A / P_B print(P_A_given_B) # 输出 0.24 ``` 上面的代码中,我们设定了 A 和 B 两个事件发生的概率分别为 0.3 和 0.4,然后我们计算出在 B 已知的情况下,A 发生的概率。最后,我们使用 print 函数将结果输出到控制台。 希望这些信息能够帮到您。 ### 回答2: 贝叶斯公式是一种用于计算条件概率统计学公式。它可以用来更新我们关于某个事件发生概率的信念,当我们获得新的证据时。 以下是一个使用贝叶斯公式计算概率的示例代码: ```python def bayes_theorem(p_a, p_b_given_a, p_b_given_not_a): # 计算贝叶斯公式的分母 p_not_a = 1 - p_a # 计算贝叶斯公式的分子 p_b = (p_b_given_a * p_a) + (p_b_given_not_a * p_not_a) # 根据贝叶斯公式计算概率 p_a_given_b = (p_b_given_a * p_a) / p_b return p_a_given_b # 假设我们有一个罐子,里面有30个红色球和10个白色球 p_red = 30 / 40 p_white = 10 / 40 # 假设我们从罐子中随机抽取一个球,抽到红色球的概率为0.5 p_red_given_event = 0.5 # 假设我们从罐子中随机抽取一个球,抽到白色球的概率为0.3 p_white_given_event = 0.3 # 使用贝叶斯公式计算给定抽到红色球的情况下,抽到白色球的概率 p_white_given_red = bayes_theorem(p_red, p_white_given_event, p_white_given_event) print("给定抽到红色球的情况下,抽到白色球的概率为:", p_white_given_red) ``` 以上示例代码计算了一个从罐子中抽取红色球的条件下,再次从罐子中抽取白色球的概率。其中,`p_a`表示前提概率(抽红球的概率),`p_b_given_a`表示已知前提下的后验概率(抽白球的概率),`p_b_given_not_a`表示不满足前提下的后验概率(抽白球的概率)。 请注意,这只是一个示例用法,实际应用中的贝叶斯公式可以用来解决更复杂的问题,例如在医学诊断和自然语言处理领域。 ### 回答3: 贝叶斯公式是用于计算条件概率的重要工具,在机器学习与统计领域广泛应用。下面给出一个示例代码来说明如何使用贝叶斯公式计算概率。 假设有一个疾病测试的案例,已知在某疾病患者中,该测试的准确率是99%,即当一个人患病时,该测试能以99%的概率给出正确的结果;而在健康人群中,该测试的误判率是2%,即当一个人健康时,该测试有2%的概率会错误地判断为患病。 现在有一个人进行了该测试并得到了阳性结果,我们想知道这个人实际上患病的概率是多少。 可以使用贝叶斯公式计算这个概率: P(患病|阳性) = P(阳性|患病) * P(患病) / P(阳性) 其中,P(患病|阳性)表示在阳性结果下的患病概率,P(阳性|患病)表示患病的人得到阳性结果的概率,P(患病)表示患病的先验概率,P(阳性)表示得到阳性结果的概率。 根据已知信息,可以得到: P(阳性|患病) = 0.99 P(患病) = 0.001 P(阳性) = P(阳性|患病) * P(患病) + P(阳性|健康) * P(健康) 代入数据进行计算: P(阳性) = 0.99 * 0.001 + 0.02 * (1 - 0.001) ≈ 0.02098 最终,根据贝叶斯公式,可以计算出该人实际上患病的概率为: P(患病|阳性) = P(阳性|患病) * P(患病) / P(阳性) ≈ 0.99 * 0.001 / 0.02098 ≈ 0.047 因此,根据这个示例代码,经过该测试得到阳性结果的人实际上患病的概率约为4.7%。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值