本文依照《机器学习从原理到应用》(卿来云、黄庆明编著,人民邮电出版社,2020 年第一版)的目录顺序整理,为系列的第四篇,覆盖非线性模型中的生成式分类器部分。本章的数学工具是概率论,核心线索是"用贝叶斯公式把分类问题转化为后验概率的比较"。

〇、本章知识地图

判别式 vs 生成式:分类模型的两大建模范式
  → 贝叶斯公式与贝叶斯决策(最小错误率准则)
  → 参数估计:极大似然估计(MLE)
  → 朴素贝叶斯:条件独立假设 → 训练与预测 → 拉普拉斯平滑 → 文本分类实例
  → 扩展:高斯(判别)模型

一、判别式模型 vs 生成式模型(范式对比)

这是本章的纲,也是高频概念题。

判别式模型 生成式模型
建模对象 直接学习 P(y\mid\mathbf{x}) 或决策边界 学习联合分布 P(\mathbf{x},y)(等价于 P(\mathbf{x}\mid y)P(y)),再由贝叶斯公式推后验
关注点 "两类之间怎么分" "每一类长什么样"
代表算法 Logistic 回归、SVM、决策树、神经网络 朴素贝叶斯、高斯判别分析、隐马尔可夫模型
对数据量的需求 相对较大 相对较小(先验假设分担了数据压力)
生成新样本 不能 可以

记忆要点:判别式直接学"分界",生成式先学"分布"再反推分类。

二、贝叶斯公式与贝叶斯决策

2.1 三个概率概念(先理清再做题)

  • 先验概率 P(y):看到样本之前,各类别出现的概率;
  • 似然(类条件概率) P(\mathbf{x}\mid y):在类别 y 下观察到特征 \mathbf{x} 的概率;
  • 后验概率 P(y\mid\mathbf{x}):观察到 \mathbf{x} 之后,它属于类别 y 的概率。

贝叶斯公式将三者联系起来:

直觉:后验 ∝ 似然 × 先验。证据 P(\mathbf{x}) 与类别无关,比较类别时只需比较分子。

2.2 贝叶斯决策(最小错误率准则)

选择使后验概率最大的类别:

贝叶斯最优分类器:在所有基于同一数据的分类器中,按此准则决策的错误率理论上最小,称为贝叶斯错误率——它是任何分类器都无法超越的下限。这是重要的概念考点:贝叶斯决策给出的是理论上限,实际分类器与其差距来源于分布估计的误差。

三、参数估计:极大似然估计(MLE)

要用贝叶斯决策,先得知道 P(y)P(\mathbf{x}\mid y),它们从训练数据中估计。最经典的准则是极大似然估计

思想一句话:让"已发生的数据"出现概率最大的参数,就是最好的参数。 实践中取对数(连乘变连加,防止下溢),再求导令其为零。

考试常考结论(均为 MLE 结果,会推更好):

  • 类别先验:
  • 高斯分布参数:均值 = 样本均值,方差 = 样本方差。

四、朴素贝叶斯分类器

4.1 条件独立假设

直接估计联合似然 P(\mathbf{x}\mid y) 面临维数灾难:n 个特征的组合数随维度指数增长。朴素贝叶斯引入条件独立假设——给定类别 y 时,各特征相互独立:

于是决策规则变为:

"朴素"一词正源于这个看似天真的假设。假设在现实中几乎不成立,但实践效果常常很好——原因是分类只需要各类得分排序正确,概率估计的系统性偏差在各类间被部分抵消。

4.2 拉普拉斯平滑

若某特征取值在训练集中从未与类别 c 共现,则 P(x_j\mid c)=0,连乘后整个后验归零,其他特征的信息全部被抹掉。解决方法:拉普拉斯平滑——每个取值的计数加 1(一般化则为加 \alpha):

其中 K_j 为特征 j 的取值个数。平滑是简答题常客:"为什么需要平滑?——防止未出现的特征取值使概率连乘归零。"

4.3 数值技巧:对数化

大量概率连乘会导致浮点下溢,实际计算一律取对数,连乘变连加:

4.4 应用实例:文本分类

朴素贝叶斯最成功的应用是文本分类(垃圾邮件过滤为经典考题场景):

  • 特征 = 单词(是否出现 / 出现次数),类别 = 垃圾邮件 / 正常邮件;
  • 训练 = 统计各类下每个单词的条件概率 + 类别先验;
  • 预测 = 代入公式取对数连加比较。

优点在该场景被放大:特征维度极高(数万词)而朴素贝叶斯训练只需一次计数扫描,速度极快。

五、扩展:连续特征与高斯模型

特征为连续值时,常用做法:假设各类下特征服从高斯分布 P(x_j\mid y=c)=\mathcal{N}(\mu_{c,j},\sigma_{c,j}^2),参数用 MLE(样本均值/方差)估计,其余流程与朴素贝叶斯一致,即高斯朴素贝叶斯。若进一步考虑特征间相关性(完整协方差矩阵),则得到高斯判别分析(GDA)

  • 各类共享协方差矩阵 → 决策边界为线性(即 LDA);
  • 各类独立协方差矩阵 → 决策边界为二次(即 QDA)。

六、朴素贝叶斯优缺点

优点 缺点
训练与预测速度极快(一次扫描) 条件独立假设常不成立
小样本、高维数据下表现稳健 概率输出不准(排序可用,数值不可信)
天然支持增量学习 对输入特征的表达方式较敏感
可解释性好 相关特征较多时性能下降明显

附:代码实践(动手 10 分钟)

片段 1:高斯朴素贝叶斯(连续特征)——对应第五节。

from sklearn.datasets import load_iris
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

clf = GaussianNB()
clf.fit(X_train, y_train)
print("测试准确率:", round(clf.score(X_test, y_test), 3))
print("某一样本的各类后验概率:", clf.predict_proba(X_test[:1]).round(3))

predict_proba 输出即贝叶斯公式算出的后验概率(已归一化),与 2.2 节的决策规则对应。

片段 2:多项式朴素贝叶斯做文本分类——对应 4.4 节,完整走一遍"计数 → 训练 → 预测"流程。

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

texts = ["win money now", "cheap price buy now", "win prize free",
         "meeting at noon", "project schedule review", "lunch together tomorrow"]
labels = [1, 1, 1, 0, 0, 0]   # 1=垃圾邮件 0=正常邮件

vec = CountVectorizer()       # 文本 → 词频特征(每个单词是一个特征)
X = vec.fit_transform(texts)

clf = MultinomialNB(alpha=1.0)  # alpha 即 4.2 节的平滑参数
clf.fit(X, labels)

test = vec.transform(["free prize win"])
print("预测类别:", clf.predict(test)[0])
print("后验概率:", clf.predict_proba(test).round(3))

两个对应关系:alpha=1.0 就是拉普拉斯平滑;CountVectorizer 把每个单词当作一个特征,正是条件独立假设作用的对象。MultinomialNB 适用于词频计数特征;若特征只表示"单词是否出现",应改用 BernoulliNB

七、本章自测题

  1. 从建模对象、代表算法、数据需求三方面比较判别式模型与生成式模型。
  2. 写出贝叶斯公式,并说明先验、似然、后验三者的含义。
  3. 什么是贝叶斯最优分类器?什么是贝叶斯错误率?
  4. 写出朴素贝叶斯的决策规则,并解释"朴素"的含义。
  5. 条件独立假设几乎总不成立,为什么朴素贝叶斯仍常有良好效果?
  6. 什么是拉普拉斯平滑?解决什么问题?
  7. 为什么实际计算朴素贝叶斯时要取对数?
  8. 以垃圾邮件过滤为例,说明朴素贝叶斯分类的完整流程。
  9. 高斯判别分析中,共享协方差与独立协方差分别得到什么样的决策边界?

八、复习建议

  1. 本章一条主线:贝叶斯公式 → 后验最大化 → 条件独立假设 → 连乘(对数连加),顺着主线复述即可覆盖 80% 考点;
  2. 两个"为什么"必背:为什么需要平滑、为什么取对数;
  3. 与前几章建立联系:Logistic 回归(判别式)与朴素贝叶斯(生成式)处理同一问题,是比较题的固定搭配。

更多推荐