01 核心原理(大白话版)

你收到一封邮件,还没打开,就能猜出它是垃圾邮件的概率(比如 30%)——这是先验概率,基于历史经验。

打开邮件,第一行写着"免费领取",你立刻更新判断,垃圾概率提高到 90%——这是后验概率,贝叶斯公式做的就是这个更新。

"朴素"指的是一个简化假设:每个词的出现与其他词独立。现实中"免费"和"中奖"经常一起出现,并不独立。但正是这个"朴素"假设让计算变得极其简单,而且实际效果很好。

贝叶斯公式

P(垃圾 | 邮件) = P(邮件 | 垃圾) × P(垃圾) / P(邮件)
1
先验概率 P(垃圾)

不看内容,历史上有多少比例是垃圾邮件?比如 40%。

2
似然 P(邮件 | 垃圾)

如果这是垃圾邮件,出现这些词的概率有多大?朴素假设:各词独立相乘。

3
后验概率 P(垃圾 | 邮件)

综合以上信息,这封邮件是垃圾邮件的概率。取概率最大的类别作为预测。

步骤1:贝叶斯公式——看到"免费"后概率如何更新

步骤2:多词联合——朴素独立假设

多个词联合出现时,用连乘计算似然(朴素假设:各词独立):

步骤3:为什么用对数概率

词越多,连乘结果越小,最终可能下溢为 0——用对数加法代替概率连乘:

步骤4:完整分类器测试

在训练集上学习词频,对测试邮件输出垃圾概率:

拉普拉斯平滑:训练集中没出现过的词,直接让概率变成 0,连乘后整个结果也变 0——太极端了。解决方案:给每个词的计数加 1(α=1),分母加词汇表大小 V,保证每个词至少有个小概率。

02 代码

修改 tests 数组中的文本(空格分词),实时观察分类概率变化。

03 学术性讲解

为什么"朴素"但好用?

条件独立假设几乎从不成立("免费"和"中奖"高度相关),但朴素贝叶斯仍然有效,原因:

  • 它只需要预测正确的类别,不需要正确的概率值。只要垃圾类的得分比正常类高就行,即使两个数值都不准确。
  • 训练数据少时,朴素假设相当于很强的正则化,防止过拟合。
  • 特征越多,独立假设的误差越趋向于相互抵消(大数定律效应)。

多项式 vs 伯努利 vs 高斯

多项式朴素贝叶斯

对词频建模,适合文本分类。本页实现的即此版本。

伯努利朴素贝叶斯

对词是否出现(0/1)建模,不考虑频率,短文本效果好。

高斯朴素贝叶斯

特征是连续值时用高斯分布建模,适合数值特征(如身高、体重)。

朴素贝叶斯 vs 逻辑回归

优先朴素贝叶斯

训练数据极少(几十条也能用)、实时需要新增数据在线更新、需要快速基线模型时。

优先逻辑回归

特征之间相关性强、数据量充足、需要精确的概率输出(校准概率)时。