☰
贝叶斯分类器全解析:从决策论到贝叶斯网的完整学习路径
2026/9/26 2:23:07 网站建设 项目流程

简介:南大出品的《机器学习导论》系列课件是一部经典入门教材配套资料,其中第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) = Σ_{j=1..N} λij · P(cj|x)

这里的 P(cj|x) 是后验概率,λij 是损失的权重。贝叶斯判定准则就是选择让条件风险最小的那个类别。把这个最小化操作封装成一个函数 h*,就是贝叶斯最优分类器,它的总体风险称为贝叶斯风险。贝叶斯风险代表的是这类问题在概率框架下的性能上限,任何模型都不可能稳定超过它,所以课件里称它“反映了学习性能的理论上限”。

举一个二分类的损失矩阵例子,假设只有好瓜和坏瓜两类:

预测 \ 真实好瓜 (c1)坏瓜 (c2)
预测 c10λ12
预测 c2λ210

如果 λ12=5,也就是把坏瓜当好瓜的售后成本很高;λ21=1,把好瓜当坏瓜最多赔一个瓜。那么决策边界会明显偏向把样本判成坏瓜。实际工程里,我会把这两类损失解耦出来单独做分析,特别是在医疗、风控场景,漏检和误报的代价往往差一个数量级,用对称的 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) = ∏_{i=1..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_好瓜| = 0
P(敲声=清脆坏瓜)|Dc,xi| / |D_坏瓜|

修正前后对比很直观:修正前只要分子为 0,整个连乘归零;修正后得到一个非零小概率,其他属性的信息得以保留。但要注意,拉普拉斯修正假设属性值与类别服从均匀分布,这是额外引入的 bias。样本量小时影响明显,样本量变大后影响趋近于 0。工程中有时用 α 平滑替代标准拉普拉斯,α=1 就是标准形式,α<1 时更保守。

3.4 查表、懒惰学习、增量学习:三种使用模式怎么选

课件把朴素贝叶斯的使用分成三种模式,这一点很多人忽略。如果对预测速度要求高,训练时把所有 P(c) 和 P(xi|c) 预计算好,预测时直接查表,这是推荐系统和文本分类里最常用的方式。如果数据更替频繁,比如用户行为特征逐小时变化,就不做训练,收到预测请求时再实时统计相关概率,课件称之为懒惰学习。如果数据不断增加但单次增量不大,可以保留已有概率估值,只对新样本涉及的项做修正,即增量学习。

模式适用场景优点缺点
查表在线预测、延迟敏感预测速度快数据变化后需要重建
懒惰学习数据频繁更新无需维护模型每次预测计算量大
增量学习数据持续积累实时吸收新样本需要设计更新逻辑

选错模式不会导致结果错误,但会导致延迟或维护成本不符合预期。我在处理日志类特征时一般选增量学习,因为数据上亿之后全量重算的代价太高,增量更新能控制在可接受范围。

4. 避坑指南:贝叶斯分类器实现中的五个常见翻车点

课件把公式推导讲得很完整,但真到自己写代码或调包时,坑通常不在推公式,而在数值处理和实现选择上。下面五条是我拆课件、复现实验时踩过的,按从最常见到最隐蔽的顺序排。

4.1 概率连乘下溢,整行预测全是 0

现象:属性超过几十个后,连乘 P(xi|c) 在浮点下直接变 0,所有类别的后验都是 0,argmax 永远返回第一个类,模型看起来“学了但没完全学”。

原因: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_y=True) model = GaussianNB() scores = cross_val_score(model, X, y, cv=5) print(scores.mean(), scores.std())

说明:GaussianNB 内部就是按类别估计每个连续属性的均值和标准差,然后代入高斯密度公式计算似然,逻辑和课件中连续属性处理完全一致。cv=5 表示五折交叉验证,对应课件第 2 章强调的模型选择方式。跑完看一下 scores,如果低于预期,回到公式卡检查是否漏了拉普拉斯修正或预处理步骤。

6.3 一点个人习惯

我最初看这套课件时按章节顺序硬啃,看到贝叶斯网时前面的极大似然已经快忘了,后来改成“先画五层框架,再对着公式卡手推一遍”,效果明显不同。从那以后,我遇见任何概率模型课程都强制走一遍“列框架 → 填公式 → 跑实验”的流程,省了不少重复复习的时间。整套课件和作业题的原始 PDF 排版很适合打印出来手推公式,下载后按这个流程过一遍,比反复看屏幕截图扎实。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询