贝叶斯定理提供了一种计算条件概率的原则性方法。
它是一个看似简单的计算,提供了一种易于使用的技术,用于处理我们直觉经常出错的情况。
培养对贝叶斯定理的直觉的最好方法是思考方程中各项的含义,并在各种不同的现实场景中多次应用该计算。这将为正在计算的内容提供背景,并为将来在新的场景中应用计算时提供起点。
在本教程中,您将通过处理多个现实场景来发现计算贝叶斯定理的直觉。
完成本教程后,您将了解:
- 贝叶斯定理是一种计算条件概率的技术。
- 用于贝叶斯定理方程各项的常用且有用的名称。
- 如何通过三个现实场景使用贝叶斯定理来找到解决方案。
开始您的项目,阅读我的新书《机器学习中的概率》,其中包括分步教程和所有示例的Python源代码文件。
让我们开始吧。

如何通过实际示例培养贝叶斯定理直觉
照片由土地管理局拍摄,部分权利保留。
教程概述
本教程分为五个部分;它们是:
- 贝叶斯定理简介
- 定理中各项的命名
- 示例 1:老年人摔倒和死亡
- 示例 2:电子邮件和垃圾邮件检测
- 示例 3:说谎者和测谎仪
贝叶斯定理简介
条件概率是指在一个事件发生的情况下,另一个事件发生的概率,通常用两个相关随机变量(例如 X 和 Y)的事件A 和B 来描述。
- 条件概率:一个(或多个)事件在另一个事件发生的情况下发生的概率,例如 P(A given B) 或 P(A | B)。
条件概率可以使用联合概率计算;例如
- P(A | B) = P(A and B) / P(B)
条件概率不是对称的;例如
- P(A | B) != P(B | A)
尽管如此,一个条件概率可以使用另一个条件概率来计算。
- P(A|B) = P(B|A) * P(A) / P(B)
贝叶斯定理提供了一种计算条件概率的原则性方法,并且是使用联合概率的替代方法。
计算条件概率的这种替代方法在联合概率难以计算,或者反向条件概率可用或易于计算时非常有用。
- 贝叶斯定理:在没有联合概率的情况下计算条件概率的原则性方法。
通常,我们无法直接获得分母,例如 P(B)。
我们可以用另一种方式计算它;例如
- P(B) = P(B|A) * P(A) + P(B|not A) * P(not A)
这给出了一个可用的贝叶斯定理公式,该公式使用了 P(B) 的替代计算,如下所示:
- P(A|B) = P(B|A) * P(A) / P(B|A) * P(A) + P(B|not A) * P(not A)
注意:分母只是我们上面给出的展开。
因此,如果我们知道 P(A),那么我们可以计算 P(not A) 作为其补集;例如
- P(not A) = 1 – P(A)
此外,如果我们知道 P(not B|not A),那么我们可以计算 P(B|not A) 作为其补集;例如
- P(B|not A) = 1 – P(not B|not A)
现在我们熟悉了贝叶斯定理的计算,让我们仔细看看方程中各项的含义。
定理中各项的命名
贝叶斯定理方程中的各项根据方程使用的上下文而被赋予不同的名称。
从这些不同的角度思考计算会有所帮助,并有助于将您的问题映射到方程。
首先,总的来说,结果 P(A|B) 被称为后验概率,P(A) 被称为先验概率。
- P(A|B):后验概率。
- P(A):先验概率。
有时 P(B|A) 被称为似然度,P(B) 被称为证据。
- P(B|A):似然度。
- P(B):证据。
这允许贝叶斯定理重述为:
- 后验 = 似然度 * 先验 / 证据
我们可以用烟雾和火灾的例子来阐明这一点。
假设有烟雾的情况下,有火灾的概率是多少?
其中 P(火灾) 是先验概率,P(烟雾|火灾) 是似然度,P(烟雾) 是证据。
- P(火灾|烟雾) = P(烟雾|火灾) * P(火灾) / P(烟雾)
您可以想象下雨和乌云的相同情况。
我们也可以从二元分类器的角度来考虑计算。
例如,P(B|A) 可能被称为真阳性率 (TPR) 或灵敏度,P(B|not A) 可能被称为假阳性率 (FPR),其补集 P(not B|not A) 可能被称为真阴性率 (TNR) 或特异度,而我们计算的值 P(A|B) 可能被称为阳性预测值 (PPV) 或精度。
- P(not B|not A):真阴性率或 TNR(特异度)。
- P(B|not A):假阳性率或 FPR。
- P(not B|A):假阴性率或 FNR。
- P(B|A):真阳性率或 TPR(灵敏度或召回率)。
- P(A|B):阳性预测值或 PPV(精度)。
例如,我们可以使用这些术语重述计算,如下所示:
- PPV = (TPR * P(A)) / (TPR * P(A) + FPR * P(not A))
这是对贝叶斯定理的一种有用的视角,并在教程中得到了进一步的阐述。
现在我们已经熟悉了贝叶斯定理及其各项的含义,让我们来看一些可以计算它的场景。
请注意,以下所有示例都是人为设计的;它们并非基于真实的概率。
示例 1:老年人摔倒和死亡
考虑一位老年人(80岁以上)摔倒的情况;他们因摔倒而死亡的概率是多少?
假设老年人死亡的基本概率 P(A) 为 10%,老年人摔倒的基本概率 P(B) 为 5%,并且在所有老年人中,有 7% 的死亡者曾经摔倒 P(B|A)。
让我们将已知信息代入定理:
- P(A|B) = P(B|A) * P(A) / P(B)
- P(死亡|摔倒) = P(摔倒|死亡) * P(死亡) / P(摔倒)
或者
- P(死亡|摔倒) = 0.07 * 0.10 / 0.05
- P(死亡|摔倒) = 0.14
也就是说,如果一位老年人摔倒,那么他们因摔倒而死亡的概率为 14%。
为了具体说明,我们可以用 Python 执行计算,首先定义我们已知的信息,然后使用贝叶斯定理计算结果。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 计算 P(A|B),已知 P(B|A)、P(A) 和 P(B) def bayes_theorem(p_a, p_b, p_b_given_a): # 计算 P(A|B) = P(B|A) * P(A) / P(B) p_a_given_b = (p_b_given_a * p_a) / p_b return p_a_given_b # P(A) p_a = 0.10 # P(B) p_b = 0.05 # P(B|A) p_b_given_a = 0.07 # 计算 P(A|B) result = bayes_theorem(p_a, p_b, p_b_given_a) # 总结 print('P(A|B) = %.3f%%' % (result * 100)) |
运行示例确认了我们手动计算的值。
1 |
P(A|B) = 14% |
示例 2:电子邮件和垃圾邮件检测
考虑我们收到一封电子邮件,并且垃圾邮件检测器将其放入垃圾邮件文件夹,那么它是垃圾邮件的概率是多少?
假设一些细节,例如我们收到的电子邮件中有 2% 是垃圾邮件 P(A)。假设垃圾邮件检测器非常有效,并且当电子邮件是垃圾邮件时,它能以 99% 的准确率检测到它 P(B|A),并且当电子邮件不是垃圾邮件时,它会以非常低的 0.1% 的概率将其标记为垃圾邮件 P(B|not A)。
让我们将已知信息代入定理:
- P(A|B) = P(B|A) * P(A) / P(B)
- P(垃圾邮件|已检测) = P(已检测|垃圾邮件) * P(垃圾邮件) / P(已检测)
或者
- P(垃圾邮件|已检测) = 0.99 * 0.02 / P(已检测)
我们不知道 P(B),即 P(已检测),但我们可以使用以下公式计算它:
- P(B) = P(B|A) * P(A) + P(B|not A) * P(not A)
或者就我们的问题而言:
- P(已检测) = P(已检测|垃圾邮件) * P(垃圾邮件) + P(已检测|非垃圾邮件) * P(非垃圾邮件)
我们知道 P(已检测|非垃圾邮件),即 0.1%,并且我们可以计算 P(非垃圾邮件) 为 1 – P(垃圾邮件);例如:
- P(非垃圾邮件) = 1 – P(垃圾邮件)
- P(非垃圾邮件) = 1 – 0.02
- P(非垃圾邮件) = 0.98
因此,我们可以计算 P(已检测) 为:
- P(已检测) = 0.99 * 0.02 + 0.001 * 0.98
- P(已检测) = 0.0198 + 0.00098
- P(已检测) = 0.02078
也就是说,大约 2% 的电子邮件被检测为垃圾邮件,无论它们是否是垃圾邮件。
现在我们可以计算答案了:
- P(垃圾邮件|已检测) = 0.99 * 0.02 / 0.02078
- P(垃圾邮件|已检测) = 0.0198 / 0.02078
- P(垃圾邮件|已检测) = 0.95283926852743
也就是说,如果一封电子邮件在垃圾邮件文件夹中,那么它实际上是垃圾邮件的概率为 95.2%。
同样,让我们用 Python 中的示例来确认此结果。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 计算垃圾邮件文件夹中的电子邮件是垃圾邮件的概率 # 计算 P(A|B),已知 P(A)、P(B|A)、P(B|not A) def bayes_theorem(p_a, p_b_given_a, p_b_given_not_a): # 计算 P(not A) not_a = 1 - p_a # 计算 P(B) p_b = p_b_given_a * p_a + p_b_given_not_a * not_a # 计算 P(A|B) p_a_given_b = (p_b_given_a * p_a) / p_b return p_a_given_b # P(A) p_a = 0.02 # P(B|A) p_b_given_a = 0.99 # P(B|not A) p_b_given_not_a = 0.001 # 计算 P(A|B) result = bayes_theorem(p_a, p_b_given_a, p_b_given_not_a) # 总结 print('P(A|B) = %.3f%%' % (result * 100)) |
运行示例给出了相同的结果,确认了我们的手动计算。
1 |
P(A|B) = 95.284% |
示例 3:说谎者和测谎仪
考虑一个人接受测谎仪测试,并且测试表明他们在撒谎。那么这个人确实在撒谎的概率是多少?
让我们假设一些细节,例如大多数接受测试的人都在说实话,例如 98%,这意味着(1 – 0.98)或 2% 是撒谎者 P(A)。还假设当一个人撒谎时,测试可以很好地检测到他们,但效果不佳,例如 72% 的时间 P(B|A)。还假设当机器说他们没有撒谎时,这是 97% 的时间 P(not B | not A)。
让我们将已知信息代入定理:
- P(A|B) = P(B|A) * P(A) / P(B)
- P(撒谎|阳性) = P(阳性|撒谎) * P(撒谎) / P(阳性)
或
- P(撒谎|阳性) = 0.72 * 0.02 / P(阳性)
同样,我们不知道 P(B),或者在这个案例中检测器会产生阳性结果的频率。
我们可以使用以下公式计算:
- P(B) = P(B|A) * P(A) + P(B|not A) * P(not A)
或
- P(阳性) = P(阳性|撒谎) * P(撒谎) + P(阳性|未撒谎) * P(未撒谎)
或者用数字表示:
- P(阳性) = 0.72 * 0.02 + P(阳性|未撒谎) * (1 – 0.02)
- P(阳性) = 0.72 * 0.02 + P(阳性|未撒谎) * 0.98
在这种情况下,我们不知道当一个人没有撒谎时出现阳性检测结果的概率;也就是说,我们不知道假阳性率或误报率。
这可以这样计算:
- P(B|not A) = 1 – P(not B|not A)
或
- P(阳性|未撒谎) = 1 – P(未阳性|未撒谎)
- P(阳性|未撒谎) = 1 – 0.97
- P(阳性|未撒谎) = 0.03
因此,我们可以计算 P(B) 或 P(阳性) 为:
- P(阳性) = 0.72 * 0.02 + 0.03 * 0.98
- P(阳性) = 0.0144 + 0.0294
- P(阳性) = 0.0438
也就是说,无论这个人是否撒谎,该测试大约有 4% 的时间返回阳性结果。
我们现在可以计算此场景的贝叶斯定理:
- P(撒谎|阳性) = 0.72 * 0.02 / 0.0438
- P(撒谎|阳性) = 0.0144 / 0.0438
- P(撒谎|阳性) = 0.328767123287671
也就是说,如果测谎仪测试结果为阳性,那么他们实际上在撒谎的概率是 32.8%。这是一个糟糕的测试!
最后,让我们在 Python 中确认此计算。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 计算测谎仪结果为阳性时一个人撒谎的概率 # 计算 P(A|B),已知 P(A)、P(B|A)、P(not B|not A) def bayes_theorem(p_a, p_b_given_a, p_not_b_given_not_a): # 计算 P(not A) not_a = 1 - p_a # 计算 P(B|not A) p_b_given_not_a = 1 - p_not_b_given_not_a # 计算 P(B) p_b = p_b_given_a * p_a + p_b_given_not_a * not_a # 计算 P(A|B) p_a_given_b = (p_b_given_a * p_a) / p_b return p_a_given_b # P(A), 基本概率 p_a = 0.02 # P(B|A) p_b_given_a = 0.72 # P(not B| not A) p_not_b_given_not_a = 0.97 # 计算 P(A|B) result = bayes_theorem(p_a, p_b_given_a, p_not_b_given_not_a) # 总结 print('P(A|B) = %.3f%%' % (result * 100)) |
运行示例给出了相同的结果,确认了我们的手动计算。
1 |
P(A|B) = 32.877% |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
总结
在本教程中,您通过处理多个现实场景,发现了计算贝叶斯定理的直觉。
具体来说,你学到了:
- 贝叶斯定理是一种计算条件概率的技术。
- 用于贝叶斯定理方程各项的常用且有用的名称。
- 如何通过三个现实场景使用贝叶斯定理来找到解决方案。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
非常有用的清晰解释。谢谢。
不客气,很高兴能帮到您!
我读过的 300 页的贝叶斯书籍也无法与您的清晰度相比。做得好!
感谢您的美言!
嗨,Jason!
您的例子多么清晰,非常喜欢烟雾与火灾、以及乌云与下雨的类比/案例,用于教学目的!
我认为在
PPV = (TPV * P(A)) / (TPR * P(A) + FPR * P(not A))
有一个拼写错误,因为我认为(为了与使用的符号保持一致)它应该是
PPV = (TPR * P(A)) / (TPR * P(A) + FPR * P(not A))
再次感谢这些实际示例……
谢谢!
抓得好,已更正。
杰森,天堂为你而存在。
谢谢!
好例子。我是一名纯粹的数学家,但我想要一些关于贝叶斯的直觉。
谢谢 Pablo!