贝叶斯定理提供了一种计算条件概率的原则性方法。
它是一个看似简单的计算,但可以用来轻松计算直觉常常失效的事件的条件概率。
尽管贝叶斯定理在概率论领域是一个强大的工具,但它在机器学习领域也得到了广泛应用。包括在概率框架中用于将模型拟合到训练数据集(称为最大后验或简称MAP),以及开发用于分类预测建模问题(如贝叶斯最优分类器和朴素贝叶斯)的模型。
在这篇文章中,您将了解用于计算条件概率的贝叶斯定理以及它在机器学习中的应用。
阅读本文后,你将了解:
- 什么是贝叶斯定理以及如何在一个真实场景中进行计算。
- 贝叶斯定理计算中各项的含义以及其背后的直觉。
- 贝叶斯定理在分类器、优化和因果模型中的应用示例。
我的新书《机器学习中的概率》将助您开启项目,其中包括逐步教程和所有示例的Python源代码文件。
让我们开始吧。
- 2019年10月更新:加入HackerNews上关于此教程的讨论。
- 2019年10月更新:扩展以添加更多贝叶斯定理的示例和用法。

机器学习贝叶斯定理简明介绍
图片由Marco Verch提供,保留部分权利。
概述
本教程分为六个部分;它们是:
- 条件概率的贝叶斯定理
- 定理中各项的命名
- 贝叶斯定理计算的实例
- 诊断测试场景
- 手动计算
- Python代码计算
- 二元分类器术语
- 用于建模假设的贝叶斯定理
- 用于分类的贝叶斯定理
- 朴素贝叶斯分类器
- 贝叶斯最优分类器
- 贝叶斯定理在机器学习中的更多用途
- 贝叶斯优化
- 贝叶斯信念网络
条件概率的贝叶斯定理
在我们深入了解贝叶斯定理之前,让我们回顾一下边际概率、联合概率和条件概率。
回想一下,边际概率是事件的概率,与其它随机变量无关。如果随机变量是独立的,那么它就是事件的直接概率;否则,如果变量依赖于其他变量,那么边际概率就是事件的概率,对所有依赖变量的所有结果求和,称为求和规则。
- 边际概率:事件的概率,与其它随机变量的结果无关,例如 P(A)。
联合概率是两个(或更多)同时发生的事件的概率,通常用来自两个依赖随机变量(例如 X 和 Y)的事件 A 和 B 来描述。联合概率通常简称为结果,例如 A 和 B。
- 联合概率:两个(或更多)同时发生的事件的概率,例如 P(A 和 B) 或 P(A, B)。
条件概率是一个事件在另一个事件发生的前提下的概率,通常用来自两个依赖随机变量(例如 X 和 Y)的事件 A 和 B 来描述。
- 条件概率:一个(或更多)事件在另一个事件发生的前提下的概率,例如 P(A 在 B 发生的情况下) 或 P(A | B)。
联合概率可以使用条件概率计算;例如
- P(A, B) = P(A | B) * P(B)
这被称为乘积规则。重要的是,联合概率是对称的,这意味着
- P(A, B) = P(B, A)
条件概率可以使用联合概率计算;例如
- P(A | B) = P(A, B) / P(B)
条件概率不是对称的;例如
- P(A | B) != P(B | A)
我们现在已经掌握了边际概率、联合概率和条件概率。如果您想了解这些基础知识的更多背景信息,请参阅教程
计算条件概率的另一种方法
现在,还有另一种计算条件概率的方法。
具体来说,一个条件概率可以用另一个条件概率来计算;例如
- P(A|B) = P(B|A) * P(A) / P(B)
反之亦然;例如
- P(B|A) = P(A|B) * P(B) / P(A)
这种计算条件概率的替代方法在联合概率难以计算(大多数情况下如此)或当逆条件概率可用或易于计算时非常有用。
这种条件概率的替代计算方法被称为贝叶斯规则或贝叶斯定理,以托马斯·贝叶斯牧师的名字命名,他被认为是第一个描述它的人。将其称为贝叶斯定理(带撇号)在语法上是正确的,但为了简洁起见,通常省略撇号。
- 贝叶斯定理:一种在没有联合概率的情况下计算条件概率的原则性方法。
通常情况下,我们无法直接获得分母,例如 P(B)。
我们可以用另一种方式计算它;例如
- P(B) = P(B|A) * P(A) + P(B|非 A) * P(非 A)
这给出了贝叶斯定理的一种表述,我们可以使用它,它使用了 P(B) 的替代计算,如下所述
- P(A|B) = P(B|A) * P(A) / P(B|A) * P(A) + P(B|非 A) * P(非 A)
或者为了清晰起见,分母加上括号
- P(A|B) = P(B|A) * P(A) / (P(B|A) * P(A) + P(B|非 A) * P(非 A))
注:分母就是我们上面给出的展开式。
因此,如果我们有 P(A),那么我们可以将其补集 P(非 A) 计算出来;例如
- P(非 A) = 1 – P(A)
此外,如果我们有 P(非 B|非 A),那么我们可以将其补集 P(B|非 A) 计算出来;例如
- P(B|非 A) = 1 – P(非 B|非 A)
现在我们熟悉了贝叶斯定理的计算,让我们仔细看看方程中各项的含义。
想学习机器学习概率吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
定理中各项的命名
贝叶斯定理方程中的各项根据其在方程中的上下文而有不同的名称。
从这些不同的角度思考计算会有帮助,并有助于将您的问题映射到方程上。
首先,一般来说,结果 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(烟)
你可以想象下雨和云朵的类似情况。
现在我们已经熟悉了贝叶斯定理和各项的含义,让我们看一个可以计算它的场景。
贝叶斯定理计算的实例
贝叶斯定理最好通过一个带有真实数据的真实实例来理解,以演示其计算过程。
首先,我们将定义一个场景,然后进行手动计算、Python 中的计算以及使用二元分类领域中您可能熟悉的术语进行计算。
- 诊断测试场景
- 手动计算
- Python代码计算
- 二元分类器术语
开始吧。
诊断测试场景
贝叶斯定理的一个出色且广泛使用的示例是医疗诊断测试的分析。
场景:考虑一个可能患有或未患癌症(癌症为真或假)的人群,以及一项对检测癌症返回阳性或阴性结果(测试为阳性或阴性)的医学测试,例如用于检测乳腺癌的乳房X光检查。
问题:如果一个随机选择的患者接受了测试并结果为阳性,那么该患者患有癌症的概率是多少?
手动计算
医疗诊断测试并非完美无缺;它们存在误差。
有时患者患有癌症,但测试却无法检测出来。测试检测癌症的能力被称为灵敏度,或真阳性率。
在这种情况下,我们将人为地设定一个测试的灵敏度值。这项测试是好的,但并非出色,其真阳性率或灵敏度为85%。也就是说,在所有患有癌症并接受测试的人中,85%的人将得到阳性结果。
- P(测试=阳性 | 癌症=真) = 0.85
根据这些信息,我们的直觉会认为患者患癌症的概率是85%。
我们对概率的直觉是错误的。
这种解释概率的错误非常常见,以至于它有自己的名称;它被称为基线谬误。
它之所以有这个名字,是因为对事件概率的估计误差是由于忽略了基线造成的。也就是说,它忽略了随机选择的人患癌症的概率,而不管诊断测试的结果如何。
在这种情况下,我们可以假设乳腺癌的概率很低,并使用每5000人中1人(即0.0002)或0.02%的人为基线值。
- P(癌症=真) = 0.02%。
我们可以使用贝叶斯定理正确计算出在测试结果为阳性的情况下,患者患癌症的概率。
让我们将我们的场景映射到方程上
- P(A|B) = P(B|A) * P(A) / P(B)
- P(癌症=真 | 测试=阳性) = P(测试=阳性|癌症=真) * P(癌症=真) / P(测试=阳性)
我们知道在患者患癌症的情况下,测试结果为阳性的概率是 85%,我们也知道随机患者患癌症的基线或先验概率是 0.02%;我们可以将这些值代入
- P(癌症=真 | 测试=阳性) = 0.85 * 0.0002 / P(测试=阳性)
我们不知道 P(测试=阳性),它没有直接给出。
相反,我们可以用以下方法估算它
- P(B) = P(B|A) * P(A) + P(B|非 A) * P(非 A)
- P(测试=阳性) = P(测试=阳性|癌症=真) * P(癌症=真) + P(测试=阳性|癌症=假) * P(癌症=假)
首先,我们可以计算 P(癌症=假) 作为 P(癌症=真) 的补集,我们已经知道了 P(癌症=真)
- P(癌症=假) = 1 – P(癌症=真)
- = 1 – 0.0002
- = 0.9998
让我们把我们拥有的信息代入
我们可以将已知值代入如下
- P(测试=阳性) = 0.85 * 0.0002 + P(测试=阳性|癌症=假) * 0.9998
我们仍然不知道在没有癌症的情况下,测试结果为阳性的概率。
这需要额外的信息。
具体来说,我们需要知道测试在正确识别未患癌症的人方面的准确性如何。也就是说,在患者未患癌症(癌症=假)时,测试结果为阴性(测试=阴性),这称为真阴性率或特异性。
我们将使用人为设定的95%特异性值。
- P(测试=阴性 | 癌症=假) = 0.95
有了这最后一条信息,我们可以将假阳性或假警报率计算为真阴性率的补集。
- P(测试=阳性|癌症=假) = 1 – P(测试=阴性 | 癌症=假)
- = 1 – 0.95
- = 0.05
我们可以将这个误报率代入我们对 P(测试=阳性) 的计算中,如下所示
- P(测试=阳性) = 0.85 * 0.0002 + 0.05 * 0.9998
- P(测试=阳性) = 0.00017 + 0.04999
- P(测试=阳性) = 0.05016
太棒了,所以无论一个人是否患有癌症,测试返回阳性结果的概率约为 5%。
我们现在有足够的信息来计算贝叶斯定理,并估计随机选择的人在得到阳性测试结果后患癌症的概率。
- P(癌症=真 | 测试=阳性) = P(测试=阳性|癌症=真) * P(癌症=真) / P(测试=阳性)
- P(癌症=真 | 测试=阳性) = 0.85 * 0.0002 / 0.05016
- P(癌症=真 | 测试=阳性) = 0.00017 / 0.05016
- P(癌症=真 | 测试=阳性) = 0.003389154704944
计算结果表明,如果患者被告知患有癌症,那么他们实际患癌症的几率只有0.33%。
这是一个糟糕的诊断测试!
这个例子也表明,条件概率的计算需要足够的信息。
例如,如果我们已经有了贝叶斯定理中使用的值,我们可以直接使用它们。
这种情况很少发生,我们通常需要计算所需的各个部分并将其代入,就像我们在这个案例中所做的那样。在我们的场景中,我们得到了3条信息:基线率、灵敏度(或真阳性率)和特异性(或真阴性率)。
- 灵敏度:85%的癌症患者将得到阳性检测结果。
- 基线率:0.02%的人患有癌症。
- 特异性:95%的非癌症患者将得到阴性检测结果。
我们没有 P(测试=阳性),但我们根据已有的信息计算出来了。
我们可以想象,贝叶斯定理让我们对给定场景更加精确。例如,如果我们有关于患者的更多信息(例如他们的年龄)和关于领域的信息(例如不同年龄段的癌症发病率),我们就能提供更准确的概率估计。
这需要大量工作。
让我们看看如何使用几行 Python 代码来计算这个确切的场景。
Python代码计算
为了使这个例子具体化,我们可以在 Python 中执行计算。
以下示例在纯 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)、P(B|A)、P(B|非 A) 的情况下计算 P(A|B) def bayes_theorem(p_a, p_b_given_a, p_b_given_not_a): # 计算 P(非 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.0002 # P(B|A) p_b_given_a = 0.85 # P(B|非 A) p_b_given_not_a = 0.05 # 计算 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) = 0.339% |
这是一个有用的脚本,您可能希望将其改编用于新场景。
现在,在二元分类中,通常使用二元分类的术语来描述贝叶斯定理的计算。它提供了一种非常直观的思考问题的方式。在下一节中,我们将回顾这些术语,并看看它们如何映射到定理中的概率以及它们如何与我们的场景相关联。
二元分类器术语
以二元(两类)分类的常见术语来思考癌症检测示例可能会有帮助,即特异性和敏感性的概念来源。
就我个人而言,这些术语有助于理解一切。
首先,让我们定义一个混淆矩阵
1 2 3 |
| 阳性类别 | 阴性类别 阳性预测 | 真阳性 (TP) | 假阳性 (FP) 阴性预测 | 假阴性 (FN) | 真阴性 (TN) |
然后我们可以从混淆矩阵中定义一些比率
- 真阳性率 (TPR) = TP / (TP + FN)
- 假阳性率 (FPR) = FP / (FP + TN)
- 真阴性率 (TNR) = TN / (TN + FP)
- 假阴性率 (FNR) = FN / (FN + TP)
这些术语被称为“率”,但也可以解释为“概率”。
另外,值得注意的是
- TPR + FNR = 1.0,或
- FNR = 1.0 – TPR
- TPR = 1.0 – FNR
- TNR + FPR = 1.0,或
- TNR = 1.0 – FPR
- FPR = 1.0 – TNR
回想一下,在前面的章节中,我们计算了假阳性率,它是真阴性率的补集,即 FPR = 1.0 – TNR。
其中一些比率有特殊的名称,例如
- 灵敏度 = TPR
- 特异性 = TNR
我们可以将这些比率映射到贝叶斯定理中熟悉的术语上
- P(B|A):真阳性率 (TPR)。
- P(非 B|非 A):真阴性率 (TNR)。
- P(B|非 A):假阳性率 (FPR)。
- P(非 B|A):假阴性率 (FNR)。
我们还可以将条件(类别)和治疗(预测)的基线率映射到贝叶斯定理中熟悉的术语上
- P(A):阳性类别 (PC) 的概率。
- P(非 A):阴性类别 (NC) 的概率。
- P(B):阳性预测 (PP) 的概率。
- P(非 B):阴性预测 (NP) 的概率。
现在,让我们用这些术语来考虑贝叶斯定理
- P(A|B) = P(B|A) * P(A) / P(B)
- P(A|B) = (TPR * PC) / PP
我们通常无法计算 P(B),因此我们使用另一种方法
- P(B) = P(B|A) * P(A) + P(B|非 A) * P(非 A)
- P(B) = TPR * PC + FPR * NC
现在,让我们看看我们的癌症和癌症检测测试的场景。
类别或条件将是“癌症”,而治疗或预测将是“测试”。
首先,让我们回顾一下所有的比率
- 真阳性率 (TPR):85%
- 假阳性率 (FPR):5%
- 真阴性率 (TNR):95%
- 假阴性率 (FNR):15%
我们再回顾一下关于基线率的知识
- 阳性类别 (PC):0.02%
- 阴性类别 (NC):99.98%
- 阳性预测 (PP):5.016%
- 阴性预测 (NP):94.984%
代入各项,我们可以计算出阳性测试结果(阳性预测)的概率为:给定癌症的阳性测试结果概率(真阳性率)乘以患癌症的基线率(阳性类别),加上给定无癌症的阳性测试结果概率(假阳性率)乘以未患癌症的概率(阴性类别)。
用这些术语计算如下
- P(B) = P(B|A) * P(A) + P(B|非 A) * P(非 A)
- P(B) = TPR * PC + FPR * NC
- P(B) = 85% * 0.02% + 5% * 99.98%
- P(B) = 5.016%
然后我们可以根据贝叶斯定理计算出该场景的概率,即在测试结果为阳性的情况下患癌症的概率(后验)等于在患癌症的情况下测试结果为阳性的概率(真阳性率)乘以患癌症的概率(阳性类别率),再除以测试结果为阳性的概率(阳性预测)。
用这些术语计算如下
- P(A|B) = P(B|A) * P(A) / P(B)
- P(A|B) = TPR * PC / PP
- P(A|B) = 85% * 0.02% / 5.016%
- P(A|B) = 0.339%
结果表明,在这种情况下,我们用贝叶斯定理计算的后验概率等同于混淆矩阵中的精确率,也称为阳性预测值 (PPV)。
- PPV = TP / (TP + FP)
或者,用我们的分类器术语来说
- P(A|B) = PPV
- PPV = TPR * PC / PP
那么,我们为什么要费力计算后验概率呢?
因为我们没有一个同时包含患癌和未患癌人群的混淆矩阵,这些人既接受了测试也未接受测试。相反,我们只有关于我们人群和测试的一些先验和概率。
这突出了我们何时可能选择在实践中使用这种计算方法。
具体来说,当我们对所涉及的事件有信念,但无法通过统计现实世界中的例子来进行计算时。
用于建模假设的贝叶斯定理
贝叶斯定理是应用机器学习中一个有用的工具。
它提供了一种思考数据与模型之间关系的方式。
机器学习算法或模型是一种思考数据中结构化关系的特定方式。通过这种方式,模型可以被视为关于数据中关系的假设,例如输入(X)和输出(y)之间的关系。应用机器学习的实践是在给定数据集上测试和分析不同的假设(模型)。
如果将模型视为假设这一想法对您来说是新的,请参阅此主题的教程
贝叶斯定理提供了一个概率模型来描述数据(D)和假设(h)之间的关系;例如
- P(h|D) = P(D|h) * P(h) / P(D)
分解开来,它表示给定一些观测数据,一个给定假设成立或为真的概率可以计算为在给定假设的情况下观测到数据的概率乘以无论数据如何假设为真的概率,再除以无论假设如何观测到数据的概率。
贝叶斯定理提供了一种根据假设的先验概率、给定假设观察到各种数据的概率以及观察到的数据本身来计算假设概率的方法。
——摘自《机器学习》,1997年,第156页。
在此框架下,计算的每个部分都有一个特定名称;例如
- P(h|D):假设的后验概率(我们想要计算的东西)。
- P(h):假设的先验概率。
这为思考和建模机器学习问题提供了一个有用的框架。
如果我们对假设有一些先验领域知识,这些知识就体现在先验概率中。如果没有,那么所有假设可能具有相同的先验概率。
如果观察数据的概率P(D)增加,那么在给定数据P(h|D)的情况下假设成立的概率就会减少。反之,如果假设P(h)的概率和在给定假设下观察数据的概率增加,则在给定数据P(h|D)的情况下假设成立的概率就会增加。
在应用机器学习中,在数据集上测试不同模型的概念可以被视为估计每个假设(H 中的 h1、h2、h3、...)在给定观测数据下为真的概率。
在建模中,寻求具有最大后验概率的优化或假设被称为最大后验或简称MAP。
任何这种最大可能的假设都被称为最大后验(MAP)假设。我们可以通过使用贝叶斯定理计算每个候选假设的后验概率来确定MAP假设。
——摘自《机器学习》,1997年,第157页。
在此框架下,数据 (D) 的概率是常数,因为它用于评估每个假设。因此,可以从计算中删除它,以给出简化的非标准化估计,如下所示
- max h in H P(h|D) = P(D|h) * P(h)
如果我们没有任何关于正在测试的假设的先验信息,它们可以被赋予一个均匀概率,并且这个项也将是一个常数,可以从计算中删除,得到以下结果
- max h in H P(h|D) = P(D|h)
也就是说,目标是找到最能解释观测数据的假设。
拟合像线性回归(用于预测数值)和逻辑回归(用于二元分类)这样的模型,可以在 MAP 概率框架下进行构建和解决。这提供了对更常见的最大似然估计(MLE)框架的替代方法。
用于分类的贝叶斯定理
分类是一个预测建模问题,涉及将标签分配给给定的输入数据样本。
分类预测建模问题可以表述为计算给定数据样本的类别标签的条件概率,例如
- P(类别|数据) = (P(数据|类别) * P(类别)) / P(数据)
其中 P(类别|数据) 是给定数据的类别的概率。
可以对问题中的每个类别执行此计算,并选择概率最大的类别并将其分配给输入数据。
在实践中,为分类问题计算完整的贝叶斯定理非常具有挑战性。
如果数据集能够很好地代表更广泛的问题,那么类别的先验概率和数据的先验概率很容易从训练数据集中估计出来。
基于类别 P(数据|类别) 的观测条件概率在实践中是不可行的,除非样本数量非常庞大,例如足以有效估计所有不同可能值组合的概率分布。这种情况几乎从未出现过,我们将无法充分覆盖该领域。
因此,贝叶斯定理的直接应用也变得难以处理,特别是当变量或特征 (n) 的数量增加时。
朴素贝叶斯分类器
使用贝叶斯定理构建条件概率分类模型的解决方案是简化计算。
贝叶斯定理假设每个输入变量都依赖于所有其他变量。这是计算复杂性的一个原因。我们可以消除这个假设,并将每个输入变量视为相互独立。
这将模型从依赖条件概率模型更改为独立条件概率模型,并大大简化了计算。
这意味着我们分别计算每个输入变量的 P(数据|类别),并将结果相乘,例如
- P(类别 | X1, X2, …, Xn) = P(X1|类别) * P(X2|类别) * … * P(Xn|类别) * P(类别) / P(数据)
我们还可以省略观察数据的概率,因为它对所有计算来说都是一个常数,例如
- P(类别 | X1, X2, …, Xn) = P(X1|类别) * P(X2|类别) * … * P(Xn|类别) * P(类别)
这种对贝叶斯定理的简化在分类预测建模问题中很常见且广泛使用,通常被称为朴素贝叶斯。
“朴素”一词源自法语,通常在“i”上带有分音符(变音符号),但为了简洁起见通常省略;“贝叶斯”则大写,因为它以托马斯·贝叶斯牧师的名字命名。
有关如何从头开始在 Python 中实现朴素贝叶斯的教程,请参阅
贝叶斯最优分类器
贝叶斯最优分类器是一种概率模型,它根据训练数据集对新示例进行最可能性的预测。
此模型也称为贝叶斯最优学习器、贝叶斯分类器、贝叶斯最优决策边界或贝叶斯最优判别函数。
- 贝叶斯分类器:一种概率模型,可以对新示例进行最可能性的预测。
具体来说,贝叶斯最优分类器回答了以下问题
给定训练数据,新实例最可能的分类是什么?
这与寻找最可能假设(模型)的MAP框架不同。相反,我们感兴趣的是进行特定预测。
下面的方程演示了如何计算给定训练数据 (D) 的新实例 (vi) 的条件概率,给定假设空间 (H)。
- P(vj | D) = sum {h in H} P(vj | hi) * P(hi | D)
其中 vj 是要分类的新实例,H 是用于分类实例的假设集合,hi 是给定假设,P(vj | hi) 是 vi 在给定假设 hi 下的后验概率,而 P(hi | D) 是假设 hi 在给定数据 D 下的后验概率。
选择具有最大概率的结果是贝叶斯最优分类的一个例子。
任何使用此方程对示例进行分类的模型都是贝叶斯最优分类器,平均而言,没有其他模型能够超越此技术。
我们必须消化一下。这是一件大事。
因为贝叶斯分类器是最优的,所以贝叶斯误差是可能产生的最小误差。
- 贝叶斯误差:进行预测时可能产生的最小误差。
它是一个理论模型,但它被视为我们可能追求的理想。
朴素贝叶斯分类器是添加了一些简化假设并试图逼近贝叶斯最优分类器的一个分类器示例。
有关贝叶斯最优分类器的更多信息,请参阅教程
贝叶斯定理在机器学习中的更多用途
开发分类器模型可能是贝叶斯定理在机器学习中最常见的应用。
然而,还有许多其他应用。两个重要的例子是优化和因果模型。
贝叶斯优化
全局优化是一个具有挑战性的问题,旨在找到一个输入,使得给定目标函数的成本最小或最大。
通常,目标函数的具体形式复杂且难以分析,并且通常是非凸、非线性、高维、带噪声且计算成本高昂。
贝叶斯优化提供了一种基于贝叶斯定理的原则性技术,用于指导全局优化问题的搜索,该技术高效且有效。它通过构建目标函数的概率模型(称为代理函数),然后使用采集函数高效地搜索该代理函数,最后选择候选样本在实际目标函数上进行评估。
贝叶斯优化在应用机器学习中常用于在验证数据集上调整给定性能良好模型的超参数。
有关贝叶斯优化的更多信息,包括如何从头开始实现它,请参阅教程
贝叶斯信念网络
概率模型可以定义变量之间的关系并用于计算概率。
完全条件模型可能需要大量数据才能覆盖所有可能情况,并且在实践中计算概率可能难以处理。简化假设(如所有随机变量的条件独立性)可能有效,例如在朴素贝叶斯的情况下,尽管这是一个极大的简化步骤。
另一种方法是开发一个模型,该模型保留随机变量之间已知的条件依赖关系,并在所有其他情况下保留条件独立性。贝叶斯网络是一种概率图模型,它通过图模型中的有向边明确捕获已知的条件依赖关系。所有缺失的连接都定义了模型中的条件独立性。
因此,贝叶斯网络提供了一个有用的工具,用于可视化领域的概率模型,审查随机变量之间的所有关系,并根据现有证据推断场景的因果概率。
这些网络并非严格意义上的贝叶斯网络,尽管考虑到随机变量(节点)的概率分布和随机变量(边)之间的关系都是主观指定的,因此该模型可以被认为捕捉了对复杂领域的“信念”。
有关贝叶斯信念网络的更多信息,请参阅教程
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
相关教程
- 联合、边缘和条件概率的简明介绍
- 什么是机器学习中的假设?
- 如何在 Python 中从零开始开发朴素贝叶斯分类器
- 用 Python 从零开始实现朴素贝叶斯分类器
- 如何在 Python 中从零开始实现贝叶斯优化
- 贝叶斯信念网络简明入门
书籍
文章
- 条件概率, 维基百科.
- 贝叶斯定理,维基百科.
- 最大后验概率估计,维基百科.
- 假阳性与假阴性,维基百科.
- 基线谬误,维基百科.
- 敏感性与特异性,维基百科.
- 消除混淆矩阵中的混淆, 2016.
总结
在这篇文章中,您了解了贝叶斯定理如何计算条件概率以及它在机器学习中的应用。
具体来说,你学到了:
- 什么是贝叶斯定理以及如何在一个真实场景中进行计算。
- 贝叶斯定理计算中各项的含义以及其背后的直觉。
- 贝叶斯定理在分类器、优化和因果模型中的应用示例。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
很棒的帖子,但是我们能否在分母周围加上括号以避免混淆
P(A|B) = P(B|A) * P(A) / [P(B|A) * P(A) + P(B|非 A) * P(非 A)]
P(癌症=真 | 测试=阳性) = 0.85 * 0.0002 / [0.85 * 0.0002 + P(测试=阳性|癌症=假) * 0.9998]
很好的建议,谢谢。
那我们都会死吗?
最终会。但不是因为贝叶斯定理。
信息量很大!
感谢您澄清最后部分的误解!!
我很高兴这个教程很有帮助。
“根据这些信息,我们的直觉会认为患者患癌症的概率是85%。
而我们的概率直觉又错了。”
我在这里迷失了。我归咎于我的无知。请解释一下,如果测试对给定结果的真实阳性返回阳性的概率使我们说患者患癌症的概率为85%是错误的,这是为什么?这句话是不是应该说“这会暗示……‘某个’患者患癌症”,而不是有人将基线推广到整个人群,而不是特定结果?
是的,措辞可以更严谨,谢谢。
也许继续研究这个例子,看看发生了什么?
我相信我做到了,但我真的只想确定。
我们想说的是,不是“正确的计算表明,如果患者通过这项测试被告知患有癌症,那么他们患癌症的几率只有0.33%。这是一项糟糕的诊断测试!”,而是说一项诊断测试,在正确识别患者癌症方面有85%的几率,以及在正确识别无癌症方面有95%的几率,那么在一组实际患癌率为0.02%的样本中,其癌症假阳性率为0.33%,而在相同人群中,假阴性率为0.51%(?)。因此,每1000名接受测试的人中,有3人会被错误地告知患有癌症。(希望能再进行两次测试……以几乎消除概率误差。)
这正确吗?
抱歉,我知道这是一个杜撰的例子,但这样的文章对我理解我未曾学习过的知识非常有帮助。我最后一个问题是,为什么h是85%,因为我假设这是在临床试验期间测量的,而0.2%是未知的,被假设为现有癌症病例的发病率?
谢谢!
不太对。
回想一下本节的开头,根本问题是:如果有人接受了测试,并且报告他们患有癌症,那么他们实际患癌症的概率是多少?
请注意,95%指的是如果此人患有癌症,则测试能检测出癌症。而85%指的是如果此人没有癌症,则没有癌症。
每个主张的条件对于解开这个场景至关重要。
最终结果回答了这个问题。如果一个可能患有或未患癌症的人接受了测试,并被告知患有癌症,那么他们患癌症的概率是多少,答案是0.33%。也就是说,“极不可能”。
是的。运用理论有助于回答问题,但正如你所说,主张很重要。我理解85%的癌症患者检测呈阳性,95%的非癌症患者检测呈阴性。因此,总的错误结果约为0.8%。其中0.33%是假阳性。另一个是假阴性,虽然被认为是更正确的,但在相同人群中占的比例更大,因此总百分比更高。
“这项测试很好,但并非出色,其真阳性率或灵敏度为85%。也就是说,在所有患有癌症并接受测试的人中,85%的人将得到阳性结果。
P(测试=阳性 | 癌症=真) = 0.85”
…
“P(测试=阴性 | 癌症=假) = 0.95”
“我们可以将此误报率代入我们的贝叶斯定理,如下所示
P(癌症=真 | 测试=阳性) = 0.85 * 0.0002 / 0.85 * 0.0002 + 0.05 * 0.9998
= 0.00017 / 0.00017 + 0.04999
= 0.00017 / 0.05016
= 0.003389154704944”
我想我明白你的意思了。
首先,让我们定义一个混淆矩阵
然后我们可以定义一些比率
– 真阳性率 (TPR) = TP / (TP + FN)
– 假阳性率 (FPR) = FP / (FP + TN)
– 真阴性率 (TNR) = TN / (TN + FP)
– 假阴性率 (FNR) = FN / (FN + TP)
另外
– 灵敏度 = TPR
– 特异性 = TNR
然后我们可以将这些比率映射到贝叶斯定理
– P(B|A):真阳性率 (TPR)。
– P(非 B|非 A):真阴性率 (TNR)。
– P(B|非 A):真阴性率 (TNR)。
– P(非 B|A):假阳性率 (FPR)。
和基线率
– P(A):阳性类别 (PC)
– P(非 A):阴性类别 (NC)
– P(B):阳性预测 (PP)
– P(非 B):阴性预测 (NP)
贝叶斯定理定义为
P(A|B) = P(B|A) * P(A) / P(B)
P(A|B) = (TPR * PC) / PP
我们喜欢用
P(B) = P(B|A) * P(A) + P(B|非 A) * P(非 A)
P(B) = TPR * PC + FPR * NC
现在,让我们看看我们的场景。
“类别”将是“癌症”,“预测”将是“测试”。我们知道这些比率
– TPR:85%
– FPR:5%
– TNR:95%
– FNR:15%
我们回顾一下关于基线率的知识
– PC:0.02%
– NC:99.98%
– PP:5.016%
– NP:94.984%
代入这些值,我们得到
P(A|B) = P(B|A) * P(A) / P(B)
P(A|B) = (TPR * PC) / PP
P(A|B) = (85% * 0.02%) / 5.016%
或者,当我们计算 P(B) 时
P(B) = P(B|A) * P(A) + P(B|非 A) * P(非 A)
P(B) = TPR * PC + FPR * NC
P(B) = 85% * 0.02% + 5% * 99.98%
这有帮助吗?
我可能会更新帖子以添加此讨论。
嗨,Jason,
我读了这篇贝叶斯机器学习教程,就我而言,它很好地总结了贝叶斯概率方法与频率方法相关的所有概念和数学符号。
我再次想说,您是一个非常慷慨的人,向我们所有人传授这些奇妙的机器学习技术程序……谢谢您。
事实上,我正在研究通过X射线胸部进行Covid19图像诊断,这些想法是二元分类的关键。
此致,
JG
谢谢,很高兴它有帮助。
祝你的项目好运!
你好,
在解释公式和使用示例方面做得非常出色。
我认为有一个错误。在计算 P(测试=阳性|癌症=假) 时,等号后您使用了:1-P(测试=阴性)|癌症=假)。我认为等号右侧不等于左侧。与左侧匹配的补集应该是:1-P(测试=阳性|癌症=假)——而这些信息在事实中并未给出。
大卫
大卫
P(测试=阳性|癌症=假) = 1 – P(测试=阴性 | 癌症=假)
我们可以更普遍地重述同一件事,取自上面术语的定义
P(B|非 A) = 1 – P(非 B|非 A)
我刚刚意识到我上面说错了。🙁
我想我应该说
a. 右侧的表达式不提供右侧所需的信息。
b. 给定的事实不允许计算左侧。
大卫
哎呀。我又犯了一个错误。(不是我的日子。)
在先前评论的 (a) 中,最后两个词应该是:*左*侧。
大卫
不确定我是否同意。也许你可以详细说明具体是如何?
Jason,
我认为这是您假设的问题
1. 您正确计算了分子(为 .0002 * .85)。
2. 然后您说,“我们仍然不知道在没有癌症的情况下,测试结果为阳性的概率。” 我们现在还不知道。为了得到最后一条信息,我们需要在分母中加上 P(B|notA *P(1-A)。在您的例子中,这是 (测试=阳性|癌症=假 * 癌症=假)。我们已经在事实中得到了这一点:它是 .15 * .9998。('.15' 是测试=阳性|癌症=真 的补集,您已经计算出癌症=假 为 .9998。)
如果您能发送我的电子邮件地址,我想提供一条私人评论,这可能对其他人没有普遍兴趣。
大卫
你随时可以在这里联系我
https://machinelearning.org.cn/contact/
精彩的解释和示例。对于我们这代没有在大学学习机器学习但想理解概念的人来说,这是最好的教程。感谢您以如此好的方式呈现它,并向公众开放。很棒的工作。上帝保佑你。
谢谢!
一如既往地感谢您的有用帖子。您提到贝叶斯推断可能难以处理,我认为这可能与在大多数情况下无法进行解析的边缘化有关。
我认为这就是MCMC和深度学习中Dropout等近似方法出现的关键点。
我仍然不相信贝叶斯推断中解析积分的难以处理性。如果我们考虑不确定参数的标准分布,我认为可能存在解析贝叶斯推断,我可以参考
参考资料中第 2.3 节“参数向量的最大后验估计”
Simon O. Haykin – 神经网络与学习机器 - Prentice Hall (2008)
对此有何评论?
谢谢!
很抱歉,我不熟悉那篇论文。
我认为我们谈论的是不同的事情。通常在贝叶斯方面,我们无法计算联合概率——我们没有所有数据,所以我们进行近似。
患者在测试结果为阳性的情况下患有癌症的概率为33.9%。这个概率被称为阳性预测值(PPV)。假阳性概率为66.1%。
然而,患者在测试结果为阴性的情况下没有癌症的概率为100%。这个概率被称为阴性预测值(NPV)。假阴性概率为0%。
你好,在贝叶斯网络中,如何使用R软件计算Kullback-Leibler散度?
我不知道,抱歉。
您好,感谢您的精彩帖子
如果您有任何关于贝叶斯潜在转换分析的内容,请告诉我。
alirezamomajed@gmail.com
目前还没有。
嗨,Jason,
你正在说
我们可以用另一种方式计算它;例如
P(B) = P(B|A) * P(A) + P(B|非 A) * P(非 A)
如果我们想用另一种方法估计 P(A),公式会是什么?这似乎不那么直接,不仅仅是交换 A 和 B。
如果您有 P(B) 而没有 P(A),也许只需反转您的项。
你知道什么会让人困惑,你也知道如何很好地解释它们。我一直在阅读关于贝叶斯的不同来源,但我对你如何深入讲解细节感到非常满意!
后验、先验、似然和证据,更不用说混淆矩阵了。谢谢!
谢谢。希望您也喜欢这里的其他帖子。
亲爱的杰森。
哦,我的天啊。
这是一篇非常棒的帖子。谢谢你。
“拟合像线性回归(用于预测数值)和逻辑回归(用于二元分类)这样的模型,可以在MAP概率框架下进行构建和解决。这提供了对更常见的最大似然估计(MLE)框架的替代方法。”
我认为先验概率是贝叶斯方法中的重要挑战。
回归和分类是监督学习,我们有标签。
聚类或共聚类是无监督学习,我们没有标签。
当我们没有标签时,我们不近似先验概率,也无法使用贝叶斯定理,除非我们假设先验等于均匀分布。
这是真的吗?
为什么贝叶斯定理没有直接用于聚类,但在朴素贝叶斯分类中却非常有用。
所有贝叶斯方法都需要先验。这是它的特点。
我正在努力巩固我对召回率和朴素贝叶斯在机器学习训练/测试集中的理解。
文章中提到如下
P(B|A):真阳性率 (TPR)(这基本上就是召回率)。
根据示例,P(B|A) 表示 P(测试=阳性 | 癌症=真)。那么,如果我进行 k 折抽样,我像往常一样训练,但对于测试集,如果我修改它们使其只包含 (癌症=真) 数据点,将它们输入到机器学习算法(例如,逻辑回归)中,然后计算该算法预测为阳性的数据点数量,结果是否等同于 P(测试=阳性 | 癌症=真),这应该再次与召回率相同?
看来您没有意识到 P(B|A) 不是一个精确的符号,因为我们不知道这个概率是如何计算的。召回率确切地说是 TP/(TP+FN)。这里的 TP 应该同时是癌症=真和测试=真,而 FN 是癌症=假和测试=真。
嗯,非常感谢您的解释,但我不得不承认我仍然有点不清楚。
这篇文章给出了很好的解释,即
P(测试=阳性 | 癌症=真) = 0.85 意味着“所有患癌症并接受测试的人中,85%的人将得到阳性结果。”
因此,如果我们将逻辑回归视为一种测试机制,并输入所有患癌症的人的数据,那么回归预测为阳性的人数基本上就是:P(测试=阳性 | 癌症=真)。我理解正确吗?
是的。但你不是这样测试的。你还需要来自癌症=假 的样本。
现在明白了。谢谢!
贝叶斯定理的极佳概述.. 谢谢
感谢您的反馈,Shekar!