啃过周志华《机器学习》这本书的同学应该都有同感前面的决策树、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或者接近0M步更新时它对应的贡献就接近于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/100.6P(坏瓜)4/100.4。再估计类条件概率P(纹理清晰|好瓜)5/6P(纹理清晰|坏瓜)1/4。然后计算后验分母相同可省略P(好瓜|清晰)0.6×(5/6)0.5P(坏瓜|清晰)0.4×(1/4)0.1。所以判为好瓜。如果题目要求用拉普拉斯修正那就需要把纹理属性的取值个数N2带入计算P(清晰|好瓜)(51)/(62)0.75P(清晰|坏瓜)(11)/(42)0.333。后验则变成P(好瓜|清晰)0.6×0.750.45P(坏瓜|清晰)0.4×0.3330.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需要比朴素贝叶斯更强的依赖表达但不想要复杂结构时”。这张表做出来整章的脉络就全在你脑子里了。
阅读完成 · 觉得有帮助?