啃过周志华《机器学习》这本书的同学应该都有同感:前面的决策树、SVM、神经网络,核心思路都是“直接找一条边界把数据分开”,属于判别式模型的路子。可翻到第7章贝叶斯分类器,画风突然就变了——不直接学边界,反而去“建模数据本身长什么样”,再通过概率算出一个样本属于每个类别的可能性。这种思维切换,配合一堆先验、似然、后验、拉普拉斯修正、EM算法,很容易把人绕晕。
这篇笔记我想把第7章从头到尾捋一遍,包含我整理的核心知识点、推导过程、课后典型习题的解题思路,也补了一些我自己做实验、准备期末复习时踩过的坑。无论你是正在学这门课的本科生,还是想快速捡起贝叶斯分类器做项目的工程师,按这个顺序读下来,应该能把这一章真正“吃透”。
1. 这一章到底在讲什么:从判别式到生成式的思维切换
1.1 贝叶斯分类器在整本书里的位置
先说说第7章在整个知识体系里的定位。前面几章讲的全是判别式模型,核心是寻找一个决策函数或者决策边界。比如决策树是在找一组划分规则,SVM是在找最大间隔超平面,神经网络是在拟合一个复杂的映射函数。它们的共同点是:我不管你数据本身的分布长什么样,我只要能把不同类别分开就好。
贝叶斯分类器走的是另一条路。它先把每个类别的数据分布估计出来,然后再用贝叶斯公式反推“给定一个样本,它属于每个类别的概率分别是多少”。这种思路叫生成式模型,因为理论上你学到了分布之后,不光能做分类,还能“生成”新的样本。这一章的学习目标就是掌握这套生成式建模的逻辑,熟悉常见的几种实现方式:朴素贝叶斯、半朴素贝叶斯、贝叶斯网,以及带隐变量时使用的EM算法。
1.2 为什么很多人觉得这一章难
我自己学下来,觉得难的点不在公式本身,而在思维惯性。贝叶斯公式很多人在概率论里就学过,形式也不复杂,但把它套到机器学习里,有三个地方特别容易卡住。
第一,符号体系突然变多。先验概率、类条件概率、后验概率、似然、证据因子,这些术语混在一起,如果脑子里没有一个清晰的概率图景,看公式就是一堆字母在打架。第二,全概率公式要求对每个类别的类条件概率做积分或者求和,真实数据里这个分布是未知的,你得先假设一个分布族再去估计参数,这就引出了极大似然估计。第三,第7章后半部分的贝叶斯网和EM算法,抽象程度再上一个台阶,如果没有前面的基础,很容易看到后面就放弃了。
其实这些东西本质上就是一层窗户纸。你只要记住一句话:机器学习里的贝叶斯分类器,就是在用训练数据估计“数据是怎么生成出来的”,然后反过来做判断。后面所有的方法,都是在回答“怎么更好地估计这个生成过程”。
2. 贝叶斯决策论的精髓:不是选最可能的类,而是选风险最小的类
2.1 三个概率之间的关系
第七章开头用了一个很经典的框架。设我们有N种可能的类别标记,记作c1、c2、…、cN,对于一个样本x,我们想判断它属于哪个类别。贝叶斯决策论的核心就是计算后验概率P(c|x),也就是“看到样本x之后,它属于类别c的概率”。
后验概率怎么算?用贝叶斯公式:
P(c|x) = P(c) * P(x|c) / P(x)
这里面P(c)是先验概率,表示在没看到任何样本特征之前,类别c本身出现的概率,通常用训练数据里各类别样本的比例来估计。P(x|c)是类条件概率,也叫似然,表示在已知类别是c的条件下,样本x出现的概率。分母P(x)是证据因子,对所有类别都一样,所以在做分类决策时可以不计算。
这里有个很容易混淆的细节:P(x|c)和P(c|x)是完全不同的两个东西。前者是“已知类别,看特征”,后者是“已知特征,判类别”。贝叶斯分类器的核心就是把后者转化成前者来求解,因为前者在生成式模型里是可以基于训练数据估计的。
2.2 为什么0-1损失下等价于最大化后验概率
教材里引入了损失函数的概念。如果真实类别是cj,我们却把它判成了ci,就会产生损失λij。那么对于样本x,把它判为ci的条件风险就是:
R(ci|x) = Σ λij * P(cj|x)
也就是说,把x判为ci这件事的风险,等于所有可能真实类别下的损失乘上对应的后验概率再求和。
如果采用0-1损失,也就是判对了损失为0,判错了损失为1,那么条件风险就可以化简成1 - P(ci|x)。要让风险最小,等价于让P(ci|x)最大。所以贝叶斯判定准则说:选择后验概率最大的类别作为分类结果。这个分类器叫贝叶斯最优分类器,它对应的总体风险叫贝叶斯风险。
要注意的是,贝叶斯决策论给出的是理论上最优的分类方式,但前提是你真的知道P(c|x)的真实值。实际应用中我们只能估计它,所以“贝叶斯最优”是一个理想上限,各种分类器都是在逼近这个上限。
2.3 生成式模型的核心:估计类条件概率
用贝叶斯公式做分类,真正难的部分是估计P(x|c)。如果x是离散的,每个属性组合都可能有很多种取值,训练数据很难覆盖所有组合。如果x是连续的,它的概率密度函数形式未知,更不好办。
于是就有了两种思路。一种叫判别式模型,直接建模P(c|x),逻辑回归就是这么干的。另一种叫生成式模型,先估计P(c)和P(x|c),再通过贝叶斯公式算出P(c|x)。第7章讲的贝叶斯分类器属于后者。
先验概率P(c)的估计很简单,用各类别样本占比就行。但P(x|c)的估计就麻烦了,因为x通常有多个属性,联合概率P(x1, x2, …, xd|c)的复杂度随属性数量指数增长。如果我们不加任何假设,直接估计这个联合分布,那需要的数据量是天文数字。这就是后面引出“属性条件独立假设”的根本原因。
3. 极大似然估计:把“猜参数”变成“算参数”
3.1 先假设一个分布,再去数据里找最可能的参数
在讲朴素贝叶斯之前,教材先补了极大似然估计(MLE)这一课。为什么需要它?因为我们要估计P(x|c),但它的具体形式不知道。一种常见做法是:假设类条件概率服从某个已知的分布族,比如高斯分布、多项分布,然后基于训练数据估计这个分布的参数。
举个具体的例子。假设我们要估计“好瓜”这一类里某个连续属性(比如甜度)的分布,先假设它服从正态分布N(μ, σ²),那么任务就变成了:用所有好瓜样本的甜度值,估计出μ和σ²这两个参数。
极大似然估计的思路是:既然这批样本已经出现了,那我们就找一组参数,使得在这组参数下,这批样本出现的概率最大。这里的“概率”在连续分布下其实是概率密度,但因为数值很小且连乘容易下溢,实际计算都会取对数,把连乘变成连加,也就是对数似然。
3.2 正态分布参数估计的推导过程
我把推导过程写一下,考试经常考,而且思路是通用的。
假设类别c的样本集是Dc,里面有n个样本,属性x服从正态分布。似然函数是:
L(μ, σ²) = Π P(xi | μ, σ²)
取对数后:
LL(μ, σ²) = Σ log P(xi | μ, σ²) = Σ [-0.5log(2π) - log(σ) - (xi-μ)²/(2σ²)]
对μ求偏导并令其等于0:
∂LL/∂μ = Σ (xi-μ)/σ² = 0
得到μ的估计值是样本均值。对σ²求偏导:
∂LL/∂σ² = Σ [-1/(2σ²) + (xi-μ)²/(2σ⁴)] = 0
得到σ²的估计值是样本方差。
注意这里求的是总体方差,分母是n而不是n-1。有些同学学概率论的时候习惯用n-1的无偏估计,但在极大似然估计的推导里,出来就是n。这是考试里一个很经典的坑。
3.3 MLE的局限:数据少的时候会翻车
极大似然估计的原理很直觉,但它有一个致命问题:如果训练数据很少,估计出来的参数会非常不准。比如某个类只有两三个样本,估计出的均值方差基本没有统计意义。
更麻烦的是,如果某个属性值在训练数据里一次都没出现过,MLE会直接给出概率为0的估计,这个0还会连锁传染到整个贝叶斯公式里,导致后验概率变成0。这就是后面朴素贝叶斯里为什么要做拉普拉斯修正的原因。所以学MLE的时候就要带着这个意识:参数估计不能只看公式,还要考虑数据量够不够、估计稳不稳定。
4. 朴素贝叶斯分类器:一个很强的假设换来一份简单
4.1 属性条件独立假设到底在做什么
要估计P(x|c)太困难了,朴素贝叶斯做了一个非常强的简化假设:假设所有属性在给定类别c的条件下相互独立。这样一来:
P(x|c) = P(x1|c) * P(x2|c) * … * P(xd|c)
这就是“朴素”两个字的来历。明明大多数情况下属性之间是有相关性的,比如西瓜的“脐部”和“触感”很可能相关,但我们强行认为它们独立。这个假设肯定会损失精度,但它把原本指数级的参数估计问题,降维成了每个属性单独估计的问题,计算复杂度大幅下降。
教材里也提到了一个值得注意的细节:虽然这个假设很“傻”,但朴素贝叶斯在很多实际任务里表现并不差,甚至有时超过了更复杂的模型。原因之一是分类任务往往只需要后验概率的相对大小,属性之间的依赖关系如果对所有类别的影响比较一致,误差会被抵消掉。另一个原因是正则化效应:简单的模型不容易过拟合。
4.2 离散属性的概率估计与拉普拉斯修正
离散属性的类条件概率P(xi|c)怎么估计?最直接的方法是频率估计:用类别c的训练样本里,属性xi取某个值的个数,除以类别c的样本总数。
问题来了:如果某个属性值和类别的组合在训练集里没有出现过,频率估计会得到0。这个0一旦进入连乘,整个后验概率直接变0,分类器就完全失效了。比如测试样本里出现了一个训练集没见过的新词,在垃圾邮件分类器里,这个邮件就会被判成非垃圾邮件,哪怕其他特征都强烈指向垃圾邮件。
解决办法就是拉普拉斯修正。具体做法是:分子加1,分母加属性取值的类别数。公式是:
P(xi|c) = (|Dc_xi| + 1) / (|Dc| + Ni)
其中Ni是第i个属性可能的取值个数。先验概率也做类似修正:
P(c) = (|Dc| + 1) / (|D| + N)
这样做的好处有两个。第一,保证任何组合的概率都不会等于0,避免连乘归零。第二,当训练数据足够多时,修正项的影响趋近于0,不会改变频率估计的渐近性质。这个修正虽然叫“拉普拉斯修正”,本质上就是给概率估计加了一个均匀先验。
4.3 连续属性的处理:高斯朴素贝叶斯
实际数据里很多属性是连续的,比如西瓜的密度、含糖率。这时候不能直接用频率统计,一种常规做法是假设类条件概率服从正态分布,然后用上文说的极大似然估计得到均值和方差,再把测试样本的值代入正态分布的概率密度函数计算。
这就是高斯朴素贝叶斯。要注意的是,这里算出来的不是真正的“概率”,而是概率密度值,密度值可能大于1。不过因为在做分类时只需要比较不同类别下密度值的乘积大小,所以密度函数里的常数项可以不care,不影响最终决策。
我自己的经验是:拿到连续属性先看分布形态,如果明显偏态,可以先做对数变换再套正态假设。如果属性是多模态分布,一个高斯拟合不出来,可以考虑高斯混合模型,但这个已经超出本章范围了。
4.4 朴素贝叶斯的实战表现与适用场景
虽然名字里带“朴素”,但它的实用性非常强。文本分类是它最经典的战场,垃圾邮件过滤、情感分析、新闻分类,基本都是朴素贝叶斯的传统优势区。原因很简单:文本数据经过词袋化之后,特征维度经常上万,如果用复杂模型很容易过拟合,而朴素贝叶斯因为假设简单、参数少,反而特别稳。
另一个适合的场景是“在线学习”。朴素贝叶斯的参数更新是计数式的,新数据来了,把对应计数加上去就行,非常适合流式数据场景。我有一次做一个商品评论实时分级的小项目,用的就是朴素贝叶斯,因为它更新模型不需要重新训练,延迟极低。
它不适合的场景也很明确:特征之间有强依赖关系且这种关系对分类很重要的时候,比如图像识别里相邻像素的强相关性,或者语音信号里帧与帧之间的时序依赖。这些场景下朴素贝叶斯的独立性假设误差太大,模型的上限太低。
5. 半朴素贝叶斯与贝叶斯网:给独立性假设“松绑”
5.1 ODE、SPODE、AODE:从独依赖到多依赖
朴素贝叶斯的独立性假设太强,现实数据很少能满足。教材接着引入了半朴素贝叶斯分类器,基本思想是“独依赖估计”,也就是假设每个属性最多只依赖一个其他属性。
最朴素的做法叫SPODE,就是给所有属性找一个共同的父属性,比如都依赖“脐部”这个属性。问题是父属性选谁?可以枚举每个属性当父属性,选效果最好的那个。
更进一步的是AODE,它把每个属性轮流作为超父,建立多个SPODE模型,然后把它们集成起来。这样既保留了一定的依赖关系,又不像完整贝叶斯网那样需要搜索复杂结构。教材里特别提到,AODE在估计概率时需要对属性值组合计数,如果某个组合没有出现,同样需要拉普拉斯修正。
从考试的角度来说,这部分通常不会考太深的推导,但需要理解“独依赖”和“朴素”的核心区别:朴素是全部独立,独依赖是允许每个属性依赖一个父属性。
5.2 贝叶斯网的结构:用有向无环图表达依赖关系
如果觉得独依赖还不够,那就上贝叶斯网。贝叶斯网用一张有向无环图来描述属性之间的依赖关系,节点代表属性,有向边代表依赖方向。比如“好瓜”这个类别下,“脐部”会影响“甜度”,“甜度”又会影响“口感”,这样的依赖链条用有向图表示就非常直观。
贝叶斯网的学习包含两部分。结构学习是找出合适的图结构,参数学习是在结构确定后估计每个节点的条件概率表。结构学习是个NP难问题,所以实际都会用贪心策略:从一个初始结构出发,每次增删或者反转一条边,看评分函数是否提升。常用的评分函数有最小描述长度、贝叶斯信息准则这些。
考试里更常考的是给定一个贝叶斯网,判断某些变量之间是否条件独立。判断工具叫有向分离(D-separation)。我记得当时学的时候有个口诀:一个节点同时连接两条有向边,如果它是中间节点,条件独立要看它是否被观测到;如果它是V型结构,恰好反过来——父节点未被观测时独立,被观测后反而不独立。这个点特别容易考,也特别容易错。
5.3 贝叶斯网的推断:精确推断与近似推断
结构学好了、参数学好了,贝叶斯网怎么用来做预测?答案是推断:在给定一些观测变量值的情况下,计算目标变量的后验概率。
精确推断的代表方法是变量消去法,核心思想是利用条件独立性,逐步对非目标变量求和,把原始的联合概率分解成多个小因子相乘,避免指数级计算。但精确推断在最坏情况下仍然是NP难的,所以实际大规模场景都用近似推断。
教材提到的吉布斯采样是近似推断的代表。思路是:先给所有未知变量随机初始化,然后每次只对一个变量采样,采样的条件分布是“给定其他所有变量当前值”。采样足够多轮之后,样本的分布就会收敛到真实的后验分布。这个过程理解起来不难,但需要注意收敛诊断和样本之间的相关性,实际使用时要小心。
吉布斯采样我当年学的时候总觉得像“玄学”,直到自己写了一遍代码才理解:它其实是在马氏链的框架下,通过反复迭代让状态分布收殓到目标分布。这里面的“接受-拒绝”思想和“采样逼近”思想,和前面SVM、决策树那种确定性算法完全不同,需要一点时间适应。
6. EM算法:当数据里藏着隐变量
6.1 为什么会有隐变量:数据不完整才是常态
学完贝叶斯网,第七章最后引入了EM算法。很多人第一次看到这个算法会觉得突兀:前面都在讲分类,怎么突然冒出个迭代优化算法?其实它和贝叶斯分类器有非常直接的关系——当我们想估计带隐变量的生成式模型时,极大似然估计直接算不出来,只能用EM。
什么是隐变量?就是影响数据生成、但你观测不到的变量。教材里最经典的例子是西瓜的根蒂脱落了,你没法判断它是“蜷缩”还是“稍蜷”,但这个属性对判断好瓜很重要。训练数据里有一部分样本的属性值是缺失的,这时候直接做极大似然估计,连似然函数都写不利索。
更典型的例子是混合高斯模型。假设数据来自K个高斯分布的混合,每个样本具体来自哪个分量是不知道的,这个“分量编号”就是隐变量。如果知道每个样本属于哪个分量,参数估计一步就能完成;问题是我们不知道。
6.2 E步与M步:一轮一轮逼近,而不是一步到位
EM算法的核心思想是:既然隐变量未知,那不如先随便猜一组模型参数,然后根据这组参数推测隐变量的分布,再用这个分布去“修补”似然函数,重新估计参数。如此循环,直到收敛。
具体分两步。E步:在当前参数下,计算隐变量的后验分布(或者它的期望),用这个期望去填充数据中的缺失部分,构造一个“完整数据”的对数似然期望。M步:最大化这个期望,得到新的参数估计。然后用新参数回到E步,反复迭代。
这里有个很微妙的地方:EM算法不保证收敛到全局最优,只保证每次迭代后似然函数不下降,所以最终结果依赖初始值。实操中常用的办法是随机初始化多组参数,跑多个EM,取似然最高的那组结果。
6.3 手推一个硬币例子
当年我学EM卡了很久,直到看到一个两硬币的例子才真正理解。假设你有两枚硬币A和B,各抛了5轮,每轮10次,但你不知道每一轮用的是哪枚硬币。观测到的只是每轮正面的次数,比如5正5反、9正1反、8正2反、4正6反、7正3反。
EM的做法是:先随便给A和B的正面概率一个初始值,比如0.6和0.5。E步:对每一轮数据,分别计算“如果这轮用的是A,出现这个结果的概率”以及“如果是B的概率”,然后归一化成A被选中的概率和B被选中的概率。M步:用这个概率作为权重,把每轮的正反面次数按权重分配到A和B上,再用分配后的数据重新估计A和B的正面概率。不断重复,直到参数不再变化。
这个过程我建议你自己在纸上推一遍,真的推一遍比看十遍都有用。你会直观感受到“缺失数据被期望值填补,然后重新估计”这个过程是怎么运作的。这也解释了为什么EM算法在这种数据缺失场景下能工作。
6.4 EM的收敛性和使用注意
教材里给了收敛性的说明:每次迭代过后,不完全数据的对数似然函数不会减小,所以算法最终会收敛到一个局部最优解。注意是局部最优,不是全局最优。而且这个收敛速度可能很慢,尤其是参数维度高的时候。
使用EM时有一个实操细节:E步里如果某个隐变量的后验概率在数值上等于0或者接近0,M步更新时它对应的贡献就接近于0,这没问题。但要注意数值下溢问题,尤其是当数据量很大、每轮的似然值都很小的时候,需要取对数运算来保持数值稳定。
我自己的经验是,EM和K-Means有一些奇妙的联系:K-Means其实可以看成是EM的一个特例,它的E步是每个样本只归属到最近的簇中心(相当于硬分配),M步是重新计算簇中心。理解了这个联系,你对EM的理解会加深很多,也更容易记住。
7. 典型习题与解题模板:从读题到拿分
7.1 第七章课后题常见题型盘点
西瓜书第7章的习题大概是全书里最容易按套路拿分的一章。我总结下来主要有几类题型。
第一类是“朴素贝叶斯计算题”,给你一个小的数据集,让你计算某个测试样本的类别。这种题考的是对贝叶斯公式和拉普拉斯修正的熟练程度。第二类是“极大似然估计推导题”,给出分布形式,让你推导参数估计公式,典型的如正态分布。第三类是“贝叶斯网条件独立判断”,给一张有向图,问某些变量在不同观测条件下是否独立。第四类是“EM算法迭代计算”,通常给一个简化场景,让你手动完成一到两轮迭代。第五类是概念辨析题,比如“判别式模型和生成式模型的区别”“为什么朴素贝叶斯叫朴素”。
这几类题的共性是:考点非常集中,掌握了模板就能拿大部分分。但前提是你要真的手推过,而不是光看答案解析。
7.2 一道完整的贝叶斯分类计算题
我拿西瓜书里类似的场景编一道题,演示完整的解题步骤。假设训练集里有10个西瓜,6个好瓜、4个坏瓜。有一个属性“纹理”,取值只有“清晰”和“模糊”两种。好瓜里纹理清晰的有5个,模糊的有1个;坏瓜里纹理清晰的有1个,模糊的有3个。现在来了一个纹理清晰的新瓜,问它是好瓜的概率是多少。
先估计先验:P(好瓜)=6/10=0.6,P(坏瓜)=4/10=0.4。再估计类条件概率:P(纹理清晰|好瓜)=5/6,P(纹理清晰|坏瓜)=1/4。然后计算后验(分母相同可省略):P(好瓜|清晰)=0.6×(5/6)=0.5,P(坏瓜|清晰)=0.4×(1/4)=0.1。所以判为好瓜。
如果题目要求用拉普拉斯修正,那就需要把纹理属性的取值个数N=2带入计算:P(清晰|好瓜)=(5+1)/(6+2)=0.75,P(清晰|坏瓜)=(1+1)/(4+2)=0.333。后验则变成P(好瓜|清晰)=0.6×0.75=0.45,P(坏瓜|清晰)=0.4×0.333=0.133,结论还是判为好瓜。这道题看着简单,但考的是你能不能正确处理“概率连乘时的数值比较”和“拉普拉斯修正的分子分母分别加几”这两个细节。
7.3 贝叶斯网中的条件独立判断(有向分离)
这里我给一个常见的判断模板。给定一个贝叶斯网结构,判断“X⊥Y|Z”是否成立时,先把结构转换成无向图,方法是对每个节点的父节点,把它们两两相连,然后把所有有向边改成无向边。之后判断X和Y是否被Z集合分开,如果被分开,则条件独立成立。
关于V型结构有个经典的反直觉结论:A->B<-C这样的结构里,A和C在B未知时是独立的,但如果B被观测到了,A和C反而变得依赖了。直观解释就是:你看到一个同时受两个因素影响的结果时,这两个因素之间就产生了“竞争解释”的关系。比如一个人感冒的概率同时受“淋雨”和“熬夜”影响,如果你知道他感冒了,同时又知道他没淋雨,那你倾向于认为是熬夜导致的。这时候淋雨和熬夜这两个原本独立的事件,就变得有关联了。
考试时遇到这种题,先圈出V型结构,再判断观测节点是否“激活”了这条路径。这个分很容易拿,前提是把规则背熟。
7.4 期末高频错题与避坑提醒
我在准备期末复习时整理了一些高频错点,分享给大家。第一个错点是混淆概率密度和概率,连续属性算出的概率密度值大于1是正常的,不要觉得算错了。第二个错点是拉普拉斯修正时忘记调整分母,分子加1的同时,分母要加的是“该属性可能的取值个数”,不是类别数。第三个错点是贝叶斯决策论里最小化风险和使用0-1损失的关系,很多人记不清哪个是因哪个是果,其实是因为用了0-1损失,我们才把问题简化为最大化后验概率,如果换成其他损失函数,结果就不一样了。
第四个错点出现在EM算法相关题目里,初值不同会导致迭代结果不同,这不是题目有问题,而是EM本身的特性。答题时最好说明“结果依赖初始值”,体现你对算法本质的理解。第五个错点是在贝叶斯网条件独立判断里忽视“隐变量是否被观测”的影响,这是这门课里最容易被扣分的地方之一。
有些同学复习时会去刷题,刷完就忘,我觉得更有效的方式是先合上书画一遍贝叶斯分类器的思维导图,把“为什么需要独立性假设、为什么需要拉普拉斯修正、为什么需要EM算法”这条逻辑线走通,再做题。逻辑线通了,题变来变去你都能反应过来它考的是哪个点。
尾声:一点点个人体会
回头再看第7章贝叶斯分类器,它的地位很特别:它不是一个“放之四海而皆准”的强力模型,而是一套看待问题的方式。判别式模型告诉你“怎么把数据分开”,贝叶斯分类器告诉你“数据是怎么产生的、概率是多少、风险有多大”。本章里的朴素贝叶斯适合快速建模和文本场景,半朴素贝叶斯是对“过于朴素”的妥协,贝叶斯网则提供了一套更精细的概率图建模语言,EM算法又补齐了数据不完整这个现实场景。学完这一章,你对“模型”这个词的理解会立体很多。
最后再分享一个我自己备考时的小窍门:把第7章各个算法的前置条件和适用场景整理成一张对照表,考前只看这张表。比如“什么时候用拉普拉斯修正?概率估计可能出现0时”“什么时候用EM?存在隐变量时”“什么时候用AODE?需要比朴素贝叶斯更强的依赖表达但不想要复杂结构时”。这张表做出来,整章的脉络就全在你脑子里了。