朴素贝叶斯分类器
你收到一封邮件,一眼扫过去就知道它是不是垃圾邮件——
机器是怎么学会这件事的?答案就藏在"数数"里面。
发件人: unknown@promo.com
主题: 重要通知!
主题: 重要通知!
🎉 恭喜!你已被选中!
免费 领取大奖,中奖 名额有限!
免费 领取大奖,中奖 名额有限!
🤔 这封邮件是垃圾邮件吗?
核心思路:朴素贝叶斯的做法非常直觉——翻一翻过去的邮件,数一数垃圾邮件里这些词出现过几次,正常邮件里又出现过几次,哪边的可能性更大,就归为哪一类。接下来我们一步步来看。
1 训练数据:过去的邮件记录
假设我们手里有 10 封已经标记好的邮件。我们从每封邮件中提取了 4 个关键词,看它们是否出现:
| 邮件内容 | 免费 | 中奖 | 会议 | 同学 | 分类 |
|---|
💡 试试看:把鼠标移到表格上,感受一下数据的分布。你能看出哪些词更"像"垃圾邮件吗?
2 先验概率:不看内容,先数比例
在 10 封邮件中,垃圾邮件和正常邮件各占多少?这就是先验概率——在不看邮件内容的情况下,一封新邮件是垃圾的"基础概率"。
5 / 10 = 50%
🚫 P(垃圾邮件)
5 / 10 = 50%
✅ P(正常邮件)
通俗理解:就像抛硬币之前,正反各 50%。这是我们的"起始判断"。接下来看邮件内容,就会不断调整这个判断。
3 条件概率:每个词的"嫌疑"有多大?
现在我们来数:在垃圾邮件中,每个关键词出现过几次?在正常邮件中呢?
比如:5 封垃圾邮件中有 3 封包含"免费"→ P("免费" | 垃圾) = 3/5
在垃圾邮件中出现的概率
在正常邮件中出现的概率
💡 观察:"免费"在垃圾和正常邮件中都出现过(3/5 vs 1/5),所以它不是"一定是垃圾",只是垃圾的可能性更高。 而"会议"只在正常邮件中出现过,是一个很强的"正常"信号。
4 相乘得结果:把线索合并起来
现在来了一封新邮件:"免费中奖啦!",包含"免费"和"中奖",不包含"会议"和"同学"。
我们的任务:算出这封邮件是垃圾/正常的概率各是多少,方法就是把所有线索乘起来。
🚫 算"是垃圾"的可能性
先验:
P(垃圾) = 1/2
含"免费":
P(免费 ✓ | 垃圾) = 3/5
含"中奖":
P(中奖 ✓ | 垃圾) = 3/5
不含"会议":
P(会议 ✗ | 垃圾) = 5/5 = 1
不含"同学":
P(同学 ✗ | 垃圾) = 5/5 = 1
全部相乘:
1/2 × 3/5 × 3/5 × 1 × 1 = 9/50 = 0.18
✅ 算"是正常"的可能性
先验:
P(正常) = 1/2
含"免费":
P(免费 ✓ | 正常) = 1/5
含"中奖":
P(中奖 ✓ | 正常) = 1/5
不含"会议":
P(会议 ✗ | 正常) = 2/5
不含"同学":
P(同学 ✗ | 正常) = 3/5
全部相乘:
1/2 × 1/5 × 1/5 × 2/5 × 3/5 = 6/1250 ≈ 0.0048
📊 归一化:换算成百分比
5 为什么叫"朴素"?
你注意到了吗?在第 4 步的计算中,我们直接把每个词的概率乘在了一起:
P(免费)
×
P(中奖)
×
P(会议)
×
P(同学)
这背后有一个大胆的假设:每个词的出现是相互独立的,互不影响。
⚠️ 真实情况:"免费"和"中奖"在垃圾邮件中经常一起出现,它们并不是完全独立的。但朴素贝叶斯"天真地"假设它们独立,所以叫"朴素"(Naive)。
你可能会问:这个假设明明不对,为什么还能用?
💡 关键洞察:虽然独立假设不完美,但朴素贝叶斯只需要比较两个乘积的大小,不需要精确值。 即使每个概率有点偏差,只要"谁大谁小"的排序没变,分类结果就是对的。这就是朴素贝叶斯"简单但好用"的秘密。
6 一个小问题:零概率陷阱
仔细看我们的数据:"会议"这个词在 5 封垃圾邮件中一次都没出现过。如果新邮件里有"会议"呢?
❌ 不做处理
P(会议 ✓ | 垃圾) = 0/5
= 0
任何数 × 0 = 0
整个乘积直接变成 0!
整个乘积直接变成 0!
✅ 拉普拉斯平滑
P(会议 ✓ | 垃圾) = (0+1) / (5+2)
= 1/7 ≈ 0.14
分子 +1,分母 +2
小概率但不是零!
小概率但不是零!
通俗理解:拉普拉斯平滑就像给每种情况预留了一张"底牌"——就算从没见过,也不能完全说"不可能"。这样就避免了"一票否决"的问题。
具体做法:分子加 1(假设每种情况至少出现 1 次),分母加 2(因为每个特征有"出现"和"不出现"两种取值)。
具体做法:分子加 1(假设每种情况至少出现 1 次),分母加 2(因为每个特征有"出现"和"不出现"两种取值)。
7 自己试试!交互式分类器
选择新邮件中包含哪些关键词,右侧会实时展示完整的计算过程:
📝 这封邮件包含:
请选择关键词,查看分类结果 →
📐 计算过程
🎓 小结
朴素贝叶斯三步走:
① 数比例 — 垃圾邮件和正常邮件各占多少?(先验概率)
② 数词频 — 每个词在两类邮件中出现了几次?(条件概率)
③ 全部乘 — 把先验和每个词的概率乘起来,比大小(朴素假设 + 贝叶斯定理)
就这么简单——本质上就是数数和乘法。 "朴素"的假设让计算变得高效,而实践证明这个方法在文本分类中效果很好。