简介南大出品的《机器学习导论》系列课件是一部经典入门教材配套资料其中第07章专门讲解贝叶斯分类器。整个章节共23页大小约1.05MB以单个PDF文件呈现。内容从贝叶斯决策论切入系统介绍了条件风险与贝叶斯最优分类器进而讨论判别式与生成式模型的区别并重点讲解贝叶斯定理、先验/后验概率、极大似然估计、朴素贝叶斯分类器及其拉普拉斯修正还延伸到半朴素贝叶斯与贝叶斯网含DAG、条件概率表、D-separation等图文结合公式推导详细。适合正在学习机器学习或人工智能入门课程的学生、备考者及自学爱好者可作为课堂笔记的补充或考前复习提纲。目前已有118人学习下载对于希望系统掌握概率图模型与贝叶斯方法的读者来说是一份简明实用的资料。1. 贝叶斯分类器这份《机器学习导论》课件的核心是整条生成式路线第一次拿到南大这份《机器学习导论》的贝叶斯分类器课件时我最直观的感受是别把它当一叠公式PPT翻完就完事。它不是只讲朴素贝叶斯怎么算而是从贝叶斯决策论、极大似然估计、朴素贝叶斯一路延伸到贝叶斯网和吉布斯采样完整走了一遍生成式模型的路线。每个章节都在回答同一个问题——如何基于有限训练样本尽可能准确地估计后验概率 P(c|x)。这份材料适合两类人一类是期末复习机器学习、想把贝叶斯这块串成体系的在校生另一类是做 AI 项目时纠结“到底该用判别式还是生成式”的从业者。按决策论 → 估计 → 修正 → 网络 → 推断的顺序拆每一页都能落成可复现的结论。2. 贝叶斯决策与极大似然先看懂损失函数再谈分类器课件从贝叶斯决策论开篇不是单纯复习概率论而是给你一个“先定义代价再选择动作”的框架。贝叶斯分类器之所以叫决策论是因为它把分类问题转化成了期望风险最小化问题。我最初看课件时也差点跳过这一节直接看朴素贝叶斯后来发现后面所有推导都建立在这套风险定义上尤其是损失矩阵的设置直接决定决策边界往哪里偏。2.1 条件风险与贝叶斯判定准则分类器到底在优化什么给定 N 个类别令 λij 代表将第 j 类样本误分类为第 i 类所产生的损失那么样本 x 被分到第 i 类的条件风险是R(ci|x) Σ_{j1..N} λij · P(cj|x)这里的 P(cj|x) 是后验概率λij 是损失的权重。贝叶斯判定准则就是选择让条件风险最小的那个类别。把这个最小化操作封装成一个函数 h*就是贝叶斯最优分类器它的总体风险称为贝叶斯风险。贝叶斯风险代表的是这类问题在概率框架下的性能上限任何模型都不可能稳定超过它所以课件里称它“反映了学习性能的理论上限”。举一个二分类的损失矩阵例子假设只有好瓜和坏瓜两类预测 \ 真实好瓜 (c1)坏瓜 (c2)预测 c10λ12预测 c2λ210如果 λ125也就是把坏瓜当好瓜的售后成本很高λ211把好瓜当坏瓜最多赔一个瓜。那么决策边界会明显偏向把样本判成坏瓜。实际工程里我会把这两类损失解耦出来单独做分析特别是在医疗、风控场景漏检和误报的代价往往差一个数量级用对称的 0/1 损失会掩盖真实成本。在 0/1 损失下所有分错代价相同条件风险最小化就退化为最大后验概率决策这是朴素贝叶斯分类器最常用的设置。课件里没有展开这部分做代价敏感学习时需要自己补上。注意比较后验概率时如果只用 argmax损失矩阵可以省略一旦引入非对称损失决策就从“概率最大”变成“风险最小”两者结果可能不同。2.2 极大似然估计的完整流程从似然函数到对数似然生成式模型的核心难点在于估计类条件概率 P(x|c)。直接估计联合概率很难所以先假设 x 在类 c 下服从某种参数分布比如高斯分布且该分布由参数 θ 唯一确定。任务就变成用训练集 Dc 估计 θ。对第 c 类样本集 Dc似然函数是所有样本密度函数的连乘连乘容易造成浮点下溢课件因此引入对数似然把连乘变成连加数值上稳定得多。import numpy as np # 假设 20 个样本每个样本的似然约为 0.3 probs np.array([0.3] * 20) print(np.prod(probs)) # 连乘结果数值上还能看 # 当属性更多、概率更小时连乘会直接下溢 probs2 np.array([0.01] * 100) print(np.prod(probs2)) # 0.0连乘下溢 print(np.sum(np.log(probs2))) # -460.5对数域计算稳定这段代码演示的就是课件里“连乘易造成下溢因此通常使用对数似然”这句话的实际含义。参数说明probs 是假设的似然值列表np.prod 做连乘np.log 取自然对数。注意比较对数得分时不需要还原 exp因为 log 是单调函数不影响 argmax 排序结果。极大似然估计的完整流程可以归纳成五步第一假设分布形式例如高斯 N(μ, σ²)第二写出似然函数连乘所有训练样本的密度值第三取对数得到对数似然第四对 μ 和 σ² 分别求偏导并令其等于 0第五解出估计值均值估计为样本均值方差估计为样本方差。小样本下我会用除以 N-1 的无偏方差版本课件按最大化似然推导得到的是除以 N 的版本两者在小样本上略有差异工程里看习惯。估计结果的准确性严重依赖所假设的概率分布形式是否符合潜在真实分布。这句话是重点极大似然估计并不能帮你选择分布族它只在你指定的分布族里找最优参数。所以做连续属性估计前先画个直方图看形态多峰或长尾就别硬套高斯。2.3 判别式与生成式什么场景下值得走贝叶斯路线用判别式模型还是生成式模型是这一章的一个重要分支决策。判别式模型直接对 P(c|x) 建模代表是决策树、BP 神经网络、SVM生成式模型先对联合分布 P(x,c) 建模再通过贝叶斯定理得到后验贝叶斯分类器是其代表。课件特别提示“贝叶斯分类器 ≠ 贝叶斯学习”贝叶斯学习是更大的框架不是这里这一个具体分类器。我一般按三个条件判断走哪条路。第一你是否需要概率输出而不是只给类别标签第二训练数据量能不能支撑联合分布的估计第三属性间的独立性是否近似成立。需要概率输出、数据量充足、属性关系不复杂时生成式路线很划算反过来只在乎决策边界、特征维度高且相关性复杂判别式模型更直接。3. 朴素贝叶斯落地独立性假设、连续属性和拉普拉斯修正怎么配合这一章解决朴素贝叶斯从公式到实现之间的三个问题独立性假设为什么能让估计变可行离散和连续属性分别怎么算 P(xi|c)以及零概率怎么处理。这三件事在课件里是连续的在工程里如果只调包不看细节翻车点往往就藏在这里。3.1 属性独立性假设为什么能绕开组合爆炸直接估计 P(x|c) 需要完整的联合分布表属性越多表的大小指数膨胀训练样本根本填不满这就是课件说的组合爆炸和样本稀疏。朴素贝叶斯的核心假设是给定类标记后各属性相互独立于是 P(x|c) 拆成 d 个边缘概率的连乘P(x|c) ∏_{i1..d} P(xi|c)分类时只需要比较所有类别的分子分母证据因子与类别无关可以不管。这个假设在现实中几乎从不成立却常常表现不错原因是决策只需要后验概率的相对大小即使概率估计有偏只要各类别的大小排序不被破坏分类结果依然正确。这里涉及的符号需要先统一。P(c) 是类先验概率用各类样本频率估计。P(xi|c) 是第 i 个属性的类条件概率。d 是属性个数N 表示训练集 D 中可能的类别数Ni 表示第 i 个属性可能的取值数。这几个符号在后面拉普拉斯修正里还会用到。3.2 离散与连续属性的估计频率计数和高斯密度两条路离散属性直接按频率估计。设 Dc 是第 c 类样本集合Dc,xi 是其中第 i 个属性取值为 xi 的样本集合则 P(xi|c) |Dc,xi| / |Dc|。这个公式看起来简单但样本量小时统计噪声很大所以才有后面的平滑修正。连续属性不能这么数因为连续取值基本不重复计数结果几乎全是 0 或 1/N方差巨大。常见做法是假设属性服从高斯分布用 Dc 内样本估计均值和方差再把新样本代入概率密度公式求似然。完整步骤是第一按类别划分训练集第二对每个连续属性计算均值和标准差第三对每个离散属性统计取值频次第四保存类别先验概率第五预测时把样本属性值代入对应公式或查表。我一般会做一个额外检查连续属性先画分布直方图。如果明显多峰或者长尾高斯假设就不合适考虑核密度估计或分箱。课件里强调的“估计结果的准确性严重依赖于所假设的概率分布形式”在这里就是直接体现。3.3 拉普拉斯修正防止连乘抹零也要接受额外偏置若某个属性值在训练集中没有与某个类别同时出现过频率估计会得到 0连乘后整个后验概率变成 0。即使其他属性都非常支持这个类别也会被这一个零直接抹掉。课件里举的例子是“敲声清脆”的好瓜训练集没出现过这种组合模型遇到该样本时就无法正确判断。拉普拉斯修正在分子上加 1分母加上可能的取值数。类别先验变为 P(c) (|Dc|1) / (|D|N)属性条件概率变为 P(xi|c) (|Dc,xi|1) / (|Dc|Ni)。计算项修正前修正后P(敲声清脆好瓜)0 / |D_好瓜| 0P(敲声清脆坏瓜)|Dc,xi| / |D_坏瓜|修正前后对比很直观修正前只要分子为 0整个连乘归零修正后得到一个非零小概率其他属性的信息得以保留。但要注意拉普拉斯修正假设属性值与类别服从均匀分布这是额外引入的 bias。样本量小时影响明显样本量变大后影响趋近于 0。工程中有时用 α 平滑替代标准拉普拉斯α1 就是标准形式α1 时更保守。3.4 查表、懒惰学习、增量学习三种使用模式怎么选课件把朴素贝叶斯的使用分成三种模式这一点很多人忽略。如果对预测速度要求高训练时把所有 P(c) 和 P(xi|c) 预计算好预测时直接查表这是推荐系统和文本分类里最常用的方式。如果数据更替频繁比如用户行为特征逐小时变化就不做训练收到预测请求时再实时统计相关概率课件称之为懒惰学习。如果数据不断增加但单次增量不大可以保留已有概率估值只对新样本涉及的项做修正即增量学习。模式适用场景优点缺点查表在线预测、延迟敏感预测速度快数据变化后需要重建懒惰学习数据频繁更新无需维护模型每次预测计算量大增量学习数据持续积累实时吸收新样本需要设计更新逻辑选错模式不会导致结果错误但会导致延迟或维护成本不符合预期。我在处理日志类特征时一般选增量学习因为数据上亿之后全量重算的代价太高增量更新能控制在可接受范围。4. 避坑指南贝叶斯分类器实现中的五个常见翻车点课件把公式推导讲得很完整但真到自己写代码或调包时坑通常不在推公式而在数值处理和实现选择上。下面五条是我拆课件、复现实验时踩过的按从最常见到最隐蔽的顺序排。4.1 概率连乘下溢整行预测全是 0现象属性超过几十个后连乘 P(xi|c) 在浮点下直接变 0所有类别的后验都是 0argmax 永远返回第一个类模型看起来“学了但没完全学”。原因IEEE 754 浮点数有下限二三十个 0.1 量级的数连乘结果就逼近 1e-300。朴素的连乘实现没有做数值保护。解决不在概率空间连乘而是到对数空间求和。训练时保存 log P(xi|c)预测时计算 Σ log P(xi|c) log P(c)比较各值大小即可。注意如果预测结果出现负无穷说明训练集中存在某个属性值与类别完全没有共现需要结合拉普拉斯修正不是单纯换 log 就能解决。4.2 测试样本带了训练集没见过的属性值预测被“抹掉”现象测试阶段遇到一个训练集中没出现过的离散属性取值模型对这个类的得分瞬间变成最低。原因频率估计没有覆盖到该取值P(xi|c)0连乘之后其他属性提供的信息被全部抹掉。这是零概率问题在生产环境最常见的版本。解决训练时对所有类别和属性取值空间做拉普拉斯修正。取值空间 Ni 要在业务上确定比如“敲声”可能的取值集合是固定的即使当前训练集没有出现也要纳入分母。4.3 连续属性被当成离散属性计数准确率崩现象把年龄、金额这类连续特征直接转成字符串或用唯一值计数准确率低得离谱。原因连续属性几乎每个样本的值都不一样频率估计变成 1/N 或 0方差极大完全没法泛化。解决换成高斯密度估计按类别统计均值和方差。直方图显示多峰或长尾时改用核密度估计或分箱。4.4 小样本直接上贝叶斯网效果反而不如朴素贝叶斯现象几千条训练数据直接做贝叶斯网结构学习交叉验证分数反而低于朴素贝叶斯。原因贝叶斯网结构搜索是 NP 难问题常用贪心算法在小样本下容易过拟合高阶联合概率估计需要的样本量随依赖阶数指数增长数据不足时误差大于独立性假设的偏差。解决先用朴素贝叶斯和半朴素贝叶斯做基线用交叉验证看差距。只有在样本量充足且明确存在强相关属性时才值得上贝叶斯网。4.5 懒惰学习模式没做缓存数据大了之后预测越来越慢现象用懒惰学习处理频繁更新的数据刚开始很灵活数据量起来后每个预测请求都需要全量统计延迟爆炸。原因懒惰学习不在训练时构建模型每次请求都现算相关概率计算量与数据量线性增长。解决给高频属性值做缓存或设置增量更新窗口周期性把累计增量合入存量概率表中。5. 半朴素贝叶斯与贝叶斯网放宽独立性假设的两条技术路线朴素贝叶斯的独立性假设在真实数据里很难成立。要放宽它有两类做法半朴素贝叶斯只引入少量依赖关系贝叶斯网用有向图表达任意依赖结构。两条路线都在课件里但难度差很多适用范围也不同。5.1 ODE、SPODE、TAN、AODE半朴素贝叶斯的渐进路线半朴素贝叶斯的基本思路是适当考虑一部分属性间的依赖最常用的是独依赖估计 ODE即每个属性在类别之外最多依赖一个其他属性这个被依赖的属性称为父属性。难点在于确定父属性。SPODE 假设所有属性都依赖同一个超父超父通过交叉验证等模型选择方法确定实现简单但依赖结构太单一。TAN 以属性间的条件互信息为边的权重构建完全图再用最大带权生成树算法保留强相关依赖得到的结构比 SPODE 灵活。AODE 更进一步把每个属性都拿来当一次超父训练 SPODE再选择训练数据足够的 SPODE 做集成其中 m 是阈值常数表示类别样本量的下限。方法父属性选择适用规模SPODE统一超父 交叉验证属性少、关系简单TAN条件互信息 最大带权生成树属性间存在局部强相关AODE每个属性轮流当超父再集成数据量较充足文本分类这类场景里AODE 的稳定性通常比 SPODE 好因为集成抵消了单一超父选错的偏差。5.2 从 ODE 到 kDE高阶依赖的样本代价一个自然的扩展是把父属性从单个属性换成包含 k 个属性的集合即 kDE将 pai 替换为包含 k 个属性的集合。问题是随着 k 增加估计所需样本数呈指数级增加。训练样本非常充分时高阶依赖可能带来泛化性能提升训练样本有限时高阶联合概率估计本身就不可靠。所以课件里特别强调不要盲目追求高阶依赖样本量不够时 kDE 还不如 ODE。5.3 贝叶斯网DAG、CPT 与 D-separation 判断条件独立性贝叶斯网和半朴素贝叶斯的关键差别是它用有向无环图 DAG 表达变量间的依赖关系每个结点附一张条件概率表 CPT。给定父结点集后每个属性与其非后裔属性独立。三变量之间可能出现链式、分叉、V 型结构条件独立性表现不同。判断两个变量在给定第三个变量时是否独立要用“有向分离” D-separation。做法是先把有向图转成道德图V 型结构的父结点用边连起来所有有向边改成无向边。转换后如果 x 和 y 在图上能被 z 分入两个不同的连通分支那么在给定 z 时 x 与 y 条件独立。我会把这个步骤当成手推贝叶斯网的固定动作先画道德图再判断不容易漏掉 V 型结构。5.4 结构学习与推断评分函数、NP 难与吉布斯采样贝叶斯网的结构需要从数据中学出来。常用评分函数基于信息论准则比如最小描述长度 MDL、AIC 和 BIC。评分函数由两部分组成网络与训练数据的拟合程度减去模型复杂度惩罚其中参数个数越多惩罚项越大。注意搜索最优贝叶斯网结构是 NP 难问题实际工程只能靠贪心搜索等近似方法。网络建好后还要做推断。精确推断直接根据贝叶斯网定义的联合概率分布计算后验也是 NP 难。常见做法是吉布斯采样先生成一个与证据 E 一致的随机样本作为初始点然后逐个考察非证据变量在其他变量取当前值的条件下采样该变量重复 T 次后统计与查询目标一致的样本比例作为后验概率的近似。变分推断是另一条近似路线把推断转成优化问题。课件里把精确推断和近似推断的边界讲得很清楚这对选型非常有帮助。6. 把课件变成公式卡用两个实操技巧完成贝叶斯复习闭环最后一章不是再看一遍课件而是把内容压缩成可随时调用的体系顺便用一个小实验验证自己确实看懂了。我的核心思路是“列框架 → 填公式 → 跑实验”。6.1 技巧一按五层结构建公式卡复习时我习惯把贝叶斯这部分拆成“决策 → 估计 → 修正 → 网络 → 推断”五层每层只留三样东西核心公式、适用条件、易错点。层核心问题必须能默写的点决策分错要付出多少代价条件风险公式损失矩阵怎么设估计联合概率怎么算似然、对数似然、高斯 MLE修正零概率怎么处理拉普拉斯修正分子 1分母 Ni网络依赖关系怎么表达DAG、CPT、道德图画法推断后验怎么算精确推断 NP 难吉布斯采样步骤这张表做完基本就把课件的骨架抽出来了。之后看任何贝叶斯相关论文都能先对应到某一层学习效率会高很多。6.2 技巧二拿真实数据集跑一遍朴素贝叶斯公式卡背完还要验证。最简单的方式是拿鸢尾花数据集用 scikit-learn 的高斯朴素贝叶斯跑五折交叉验证。from sklearn.naive_bayes import GaussianNB from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score X, y load_iris(return_X_yTrue) model GaussianNB() scores cross_val_score(model, X, y, cv5) print(scores.mean(), scores.std())说明GaussianNB 内部就是按类别估计每个连续属性的均值和标准差然后代入高斯密度公式计算似然逻辑和课件中连续属性处理完全一致。cv5 表示五折交叉验证对应课件第 2 章强调的模型选择方式。跑完看一下 scores如果低于预期回到公式卡检查是否漏了拉普拉斯修正或预处理步骤。6.3 一点个人习惯我最初看这套课件时按章节顺序硬啃看到贝叶斯网时前面的极大似然已经快忘了后来改成“先画五层框架再对着公式卡手推一遍”效果明显不同。从那以后我遇见任何概率模型课程都强制走一遍“列框架 → 填公式 → 跑实验”的流程省了不少重复复习的时间。整套课件和作业题的原始 PDF 排版很适合打印出来手推公式下载后按这个流程过一遍比反复看屏幕截图扎实。希望帮到你。本文还有配套的精品资源点击获取
