朴素贝叶斯 · 从规则到概率


当判定需要 "可信度" 而非 "是/否" 的时候

南京大学计算机学院    杨已彪

计算机软件新技术全国重点实验室

yangyibiao@nju.edu.cn

2026 年 10 月

从 K-Means 到朴素贝叶斯 · 一个自然的追问

📗 K-Means 帮我们解决了
  • 无标注也能发现群体 → 让数据自己 "抱团"

  • 输出:簇与中心点

  • 能圈出异常群体

❓ 但还有一个问题
  • 只能回答 "谁和谁像",不能回答 "这一台有多可疑"

  • 簇里的人是谁? 正常还是恶意? 还要靠人命名

  • 研判要的是 "带可信度的结论",不是 "分组"

🚨 核心转折: 决策树给了 "规则",K-Means 给了 "分组" —— 但都不是 "有多大可能"。网空研判要的,是每一台主机有多大可能是威胁。

🎯 朴素贝叶斯: 在不确定性下做判断 —— 输出不是 "是/否",而是概率。

一个网空场景:钓鱼邮件识别

某部收到一批邮件,需要判定是否为钓鱼邮件。

📋 已知情报

情报 数据
历史钓鱼邮件比例 15%(先验概率)
钓鱼邮件中含 "紧急" 80%
正常邮件中含 "紧急" 10%

❓ 待求解的问题

新邮件包含 "紧急" 字样

它是钓鱼邮件的概率 有多大?

🌳 规则法(决策树)会怎么做? "是否包含 '紧急' ?" → 是 → 判定为钓鱼 输出:是/否

📊 贝叶斯会怎么做? 用历史数据 + 贝叶斯公式 → 计算后验概率 输出:\(P(\text{钓鱼} \mid \text{紧急}) = ?\)

💡 本部分目标: 学会在不确定条件下,用概率而非规则来做判断。

人类的直觉 vs 贝叶斯

人类在判断时,已经在潜意识里使用贝叶斯思想:

🧠 人类的直觉

看到 "紧急" 这个词 ↓ 在脑中搜索:

  • 钓鱼邮件中,有多少包含 "紧急" ?

  • 正常邮件中,有多少包含 "紧急" ? ↓ 综合判断 → 直觉上觉得 "这封邮件有问题"

📐 贝叶斯定理

\(P(\text{钓鱼} \mid \text{紧急}) = \dfrac{P(\text{紧急} \mid \text{钓鱼}) \times P(\text{钓鱼})}{P(\text{紧急})}\)

符号对应直觉:

  • \(P(\text{钓鱼})\) → 以前见过钓鱼邮件吗?

  • \(P(\text{紧急} \mid \text{钓鱼})\) → 钓鱼邮件中 "紧急" 多吗?

  • \(P(\text{紧急})\) → "紧急" 本身常见吗?

💡 贝叶斯做的,就是把人类的这种直觉 "数学化" —— 用概率代替 "感觉",用公式代替 "大概"

决策树 vs 朴素贝叶斯 · 一个直观对比

🌳 决策树
维度 说明
输出 是/否
规则 如果 A 则 B
本质 确定性逻辑
适用 有明确判据的场景

像 对答案

🎲 朴素贝叶斯
维度 说明
输出 87% 是恶意
规则 概率推理
本质 不确定性量化
适用 需要可信度的场景

像 打分

🎯 网空启示: 战场上,我们需要的往往不是 "是不是",而是 "有多大概率是" —— 后者更有决策价值。

贝叶斯思想 · 根据证据修正认知

先有一个初始判断(先验),看到新证据后更新判断(后验)。

初始判断
\( P(\text{钓鱼}) = 15\% \)
(看到证据之前)
→
看到证据
"紧急" 字样
(获得了新信息)
→
更新后的判断
\( P(\text{钓鱼} \mid \text{紧急}) \approx 58\% \)
(结合先验 + 证据)
🔹 先验概率
\( P(\text{钓鱼}) \)
看到证据之前的初始判断
🔸 似然
\( P(\text{紧急} \mid \text{钓鱼}) \)
证据在目标类别中的表现
🔹 后验概率
\( P(\text{钓鱼} \mid \text{紧急}) \)
看到证据之后的更新判断

💡 用新证据修正旧认知,让判断越来越接近真相。

贝叶斯定理 · 数学表达

\[ P(A \mid B) = \frac{P(B \mid A) \times P(A)}{P(B)} \]

符号 含义 网空场景对应
\(P(A \mid B)\) 后验概率:看到证据 B 后,事件 A 发生的概率 看到 "紧急" 字样后,是钓鱼邮件的概率
\(P(A)\) 先验概率:看到证据前,事件 A 发生的概率 历史中钓鱼邮件的比例(15%)
\(P(B \mid A)\) 似然:在事件 A 发生的条件下,看到证据 B 的概率 钓鱼邮件中出现 "紧急" 的概率(80%)
\(P(B)\) 证据概率:看到证据 B 的总概率 所有邮件中出现 "紧急" 的总概率

翻译成人话: 后验概率 = 先验 × 证据的 "说服力"

贝叶斯定理 · 一个直观类比

贝叶斯定理就像 "破案" —— 用新证据逐步锁定真凶。

🔍 破案角色
案发前的怀疑程度
🔍 破案角色
嫌疑人的作案特征
🔍 破案角色
综合判断
📐 数学对应
先验 \( P(A) \)
📐 数学对应
似然 \( P(B \mid A) \)
📐 数学对应
后验 \( P(A \mid B) \)
🎯 网空对应
历史钓鱼邮件比例
🎯 网空对应
"紧急" 在钓鱼邮件中的概率
🎯 网空对应
看到 "紧急" 后的钓鱼概率

💡 贝叶斯就是用数学方式模拟人类 "根据新证据调整判断" 的思维方式。

贝叶斯公式 · 推导

理解条件概率: \( P(A \mid B) \) = 在 B 条件下 A 的概率(如:紧急邮件中钓鱼的比例)

1 条件概率定义

\[ P(A \mid B) = \frac{P(A \cap B)}{P(B)} \] "在 B 条件下 A 的概率" = A 和 B 同时发生 ÷ B 发生

→
2 联合概率对称

\[ P(A \cap B) = P(B \mid A) \times P(A) \] "A 和 B 同时发生" = 在 A 条件下 B 的概率 × A 的概率

→
3 代入 → 贝叶斯公式

\[ P(A \mid B) = \frac{P(B \mid A) \times P(A)}{P(B)} \] \[ = \frac{P(B \mid A)P(A)}{P(B \mid A)P(A) + P(B \mid \bar{A})P(\bar{A})} \]

💡 每一步都源于条件概率的定义,贝叶斯公式本身没有引入任何额外假设。

贝叶斯 vs 直接统计

换个基线: 上文的机构先验是 15%;若某机构历史上钓鱼邮件仅占 1%,而当前情报显示 0-day 攻击爆发、钓鱼占比已升至 40% —— 历史观察数据(100 封邮件):

类别 邮件数 含 "点击链接"
钓鱼 1 1 (100%)
正常 99 5 (≈ 5%)
❌ 直接统计

含 "点击链接" 的邮件共 6 封(1 封钓鱼 + 5 封正常) \[ P(\text{钓鱼}|\text{点击链接}) = \frac{1}{1+5} \approx 16.7\% \] 问题: 被大量 "正常" 邮件稀释,严重低估真实风险。

✅ 贝叶斯

已知:

  • 先验: \( P(\text{钓鱼}) = 40\% \),\( P(\text{正常}) = 60\% \)

  • 似然: \( P(\text{点击链接}|\text{钓鱼}) = 1/1 = 1 \)

  • 似然: \( P(\text{点击链接}|\text{正常}) = 5/99 \approx 0.05 \) 公式: \[ P(\text{钓鱼}|\text{点击链接}) = \frac{P(\text{点击链接}|\text{钓鱼}) \times P(\text{钓鱼})} {P(\text{点击链接}|\text{钓鱼}) \times P(\text{钓鱼}) + P(\text{点击链接}|\text{正常}) \times P(\text{正常})} \] 代入: \[ = \frac{1 \times 0.4}{1 \times 0.4 + 0.05 \times 0.6} = \frac{0.4}{0.43} \approx 93\% \]

结论: 修正后 P(钓鱼 | 点击链接) ≈ 93%(融合先验 40%)

💡 直接统计 "向后看" (被历史数据淹没),贝叶斯 "向前看" (融合实时情报)

朴素贝叶斯 · "朴素" 在哪里?

核心假设:所有特征互相独立。

📧 邮件特征

新邮件包含:

  • 紧急

  • 中奖

  • 链接

🧠 朴素假设

这些特征互相独立,互不影响: \[ \small P(\text{紧急}, \text{中奖}, \text{链接} \mid \text{钓鱼}) = P(\text{紧急} \mid \text{钓鱼}) \times P(\text{中奖} \mid \text{钓鱼}) \times P(\text{链接} \mid \text{钓鱼}) \]

✅ 为什么有效?
  • 计算量从指数级降为线性级

  • 高维数据也能快速处理

  • 文本分类中效果优异

⚠ 现实中的局限
  • 特征通常相关("紧急"+"中奖" 常同时出现)

  • 但朴素假设在实际应用中效果依然很好

💡 "朴素" 不是 "幼稚" —— 它是一种工程上的简化,用可接受的精度换取计算效率。

贝叶斯如何做决策?

计算每个类别的后验概率,选择概率最大的那个。

📧 输入
新邮件特征

紧急 · 中奖 · 链接

→
📊 计算

\( P(\text{钓鱼} \mid \text{特征}) = ? \)

\( P(\text{正常} \mid \text{特征}) = ? \)

→
✅ 决策
选概率最大的

谁大 → 判给谁

💡 贝叶斯不做 "是/否" 判断,而是计算每个类别的概率,选最大的那个 —— 决策过程与 "对答案" 截然不同,更像在 "打分比高低"。

一个网空例子 · 逐步计算

某机构历史邮件统计:

类别 先验概率 含 "紧急" 含 "中奖"
钓鱼 15% 80% 60%
正常 85% 10% 5%

新邮件同时包含 "紧急" 和 "中奖" (为便于手算,暂略 "链接" 特征) 求: \( P(\text{钓鱼} \mid \text{紧急}, \text{中奖}) = ? \)

朴素贝叶斯假设: "紧急" 和 "中奖" 相互独立

💡 接下来:先算证据 \( P(\text{紧急}, \text{中奖}) \),再算后验概率

第一步 · 计算 P(证据)

📊 历史数据回顾:

类别 先验 含 "紧急" 含 "中奖"
钓鱼 15% 80% 60%
正常 85% 10% 5%

\[ \begin{aligned} P(\text{紧急}, \text{中奖}) &= P(\text{紧急},\text{中奖}|\text{钓鱼}) \times P(\text{钓鱼}) + P(\text{紧急},\text{中奖}|\text{正常}) \times P(\text{正常}) \\ &= (\textcolor{#e74c3c}{0.8} \times \textcolor{#f39c12}{0.6}) \times \textcolor{#268bd2}{0.15} + (\textcolor{#e74c3c}{0.1} \times \textcolor{#f39c12}{0.05}) \times \textcolor{#268bd2}{0.85} \\ &= 0.48 \times 0.15 + 0.005 \times 0.85 \\ &= 0.072 + 0.00425 \\ &= 0.07625 \end{aligned} \]

P(证据) ≈ 7.6% — 所有邮件中同时包含 "紧急" 和 "中奖" 的比例

第二步 · 计算 P(钓鱼 | 证据)

📊 历史数据回顾:

类别 先验 含 "紧急" 含 "中奖"
钓鱼 15% 80% 60%
正常 85% 10% 5%

朴素贝叶斯假设: "紧急" 和 "中奖" 相互独立 \[ \begin{aligned} P(\text{钓鱼}|\text{紧急},\text{中奖}) &= \frac{P(\text{紧急}|\text{钓鱼}) \times P(\text{中奖}|\text{钓鱼}) \times P(\text{钓鱼})}{P(\text{紧急},\text{中奖})} \\[2pt] &= \frac{(\textcolor{#e74c3c}{0.8}) \times (\textcolor{#f39c12}{0.6}) \times \textcolor{#268bd2}{0.15}}{0.07625} \\[2pt] &= \frac{0.48 \times 0.15}{0.07625} \\[2pt] &= \frac{0.072}{0.07625} \\[2pt] &\approx 0.944 \end{aligned} \]

结论:约 94.4% 概率是钓鱼邮件!

计算结果解读

判断阶段
先验
看到 "紧急"
+"中奖"
概率
15%
≈ 58%
94.4%
说明
仅凭历史数据
"紧急" 是一个强信号
两个证据叠加,信心大幅提升

📊 中间计算(看到 "紧急" 时): \[ P(\text{钓鱼}|\text{紧急}) = \frac{0.8 \times 0.15}{0.8 \times 0.15 + 0.1 \times 0.85} \approx 58.5\% \]

🎯 最终判断(两个证据叠加): \[ P(\text{钓鱼}|\text{紧急},\text{中奖}) = \frac{0.8 \times 0.6 \times 0.15}{0.07625} \approx 94.4\% \]

💡 实战含义: 单看 "紧急" 不可靠(58%),加上 "中奖" 后可信度显著上升(94%)。这就是贝叶斯 "多证据综合研判" 的价值 —— 不是孤立的证据,而是证据的叠加效应。

先验的重要性 · 两个维度

同样的证据,不同的先验 → 不同的结论

场景 先验 P(钓鱼) 后验 \(P(\text{钓鱼} \mid \text{紧急}, \text{中奖})\)
某机构 A(钓鱼邮件常见) 15% 94.4%
某机构 B(钓鱼邮件罕见) 1% ~49%

🌍 空间维度:不同机构基线不同

  • 机构 A 经常被钓鱼攻击 → 先验 15%

  • 机构 B 防护严密 → 先验 1%

  • 同样的特征在不同环境下意义不同

⏰ 时间维度:同一机构态势变化

  • 平时:先验 1%

  • 攻击爆发时:先验 40%

  • 先验需要随威胁态势动态调整

⚠ 网空启示: 先验不是拍脑袋决定的 —— 它应该反映当前、本地的威胁态势,既是空间维度上需要本地化的基线水平,也是时间维度上需要动态更新的实时情报。

Sklearn 实践 · 生成数据 + 训练模型

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
# 生成模拟数据(10 维特征, 2000 样本)
X, y = make_classification(n_samples=2000, n_features=10,
                           n_informative=6, random_state=42)
# 划分训练/测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42)
# 训练朴素贝叶斯
model = GaussianNB()
model.fit(X_train, y_train)
print(f"准确率: {model.score(X_test, y_test):.4f}")

典型输出: 准确率: 0.8750

Sklearn 实践 · 预测与概率

# 对新样本进行预测
pred = model.predict(X_test[:10])
print(pred)  # [1 0 1 1 0 ...]
# 查看每个类别的概率
proba = model.predict_proba(X_test[:5])
print(proba)

概率输出示例:

[[0.12 0.88]   → 第 1 个样本: 88% 属于类别 1
 [0.91 0.09]   → 第 2 个样本: 91% 属于类别 0
 [0.05 0.95]   → 第 3 个样本: 95% 属于类别 1
 ...]

这是决策树做不到的:不仅告诉你答案,还告诉你 "有多大把握"。

Sklearn 实践 · 三种朴素贝叶斯变体

from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
变体 适用场景 数据要求
GaussianNB 连续特征(如流量大小、频率) 特征服从正态分布
MultinomialNB 文本分类、计数特征 非负频次数据
BernoulliNB 二值特征(0/1) 布尔值/二元特征

网空场景选择建议:

网空场景 推荐变体
流量统计特征(连续值) GaussianNB
DNS 查询类型、协议标志(计数) MultinomialNB
是否存在某特征(0/1) BernoulliNB

朴素贝叶斯 · 优缺点(网空视角)

✅ 核心优势

优势 网空价值
极快 实时检测毫秒级响应
无需大量数据 小样本也能工作
概率输出 提供可信度而非简单结论
高维友好 可处理数千维特征
增量学习 支持在线更新模型

⚠ 固有局限

局限 网空应对
特征独立性假设 实际特征多相关 → 可做特征选择/降维
对输入分布敏感 需根据数据分布选择合适的变体
不能自动学习特征组合 可结合人工特征工程

💡 朴素贝叶斯 "朴素" 在假设独立,但它的速度和概率输出在网空场景中价值巨大

朴素贝叶斯在网空领域的典型应用

场景 贝叶斯做什么 为什么选它
📧 钓鱼邮件/URL 识别 计算恶意概率 概率输出便于分级处置
🚨 告警可信度评分 评估告警的真实性 帮助分析师优先处理高风险告警
🌐 DNS 隧道检测 域名请求异常概率 小样本也能快速适配新威胁
📊 流量分类 判断流量类型概率 实时处理,毫秒级响应
🧠 攻击阶段推断 计算当前处于攻击链哪一步 不确定性量化辅助决策

随堂思考题

某部内网部署了钓鱼邮件检测系统。 方案 A: 决策树模型(准确率 88%,输出:是/否) 方案 B: 朴素贝叶斯模型(准确率 86%,输出:85% 可能是钓鱼) 问题: 如果你是安全负责人,你会选择哪个方案?为什么?

如何选择? —— 方案对比

取决于使用场景:

🤖 自动拦截
误拦成本低

→ 决策树(A) 需要明确规则,高准确率直接拦截

🧠 辅助研判
误拦成本高

→ 朴素贝叶斯(B) 输出概率,分析师可结合上下文综合判断

⚡ 资源受限
边缘/端侧部署

→ 朴素贝叶斯(B) 更轻量,训练和推理更快,无需 GPU

📋 需要审计
合规/溯源要求

→ 决策树(A) 规则透明,每条判据可追溯

📊 朴素贝叶斯
→ 初筛(可疑度评分)
↓
🌳 决策树
→ 明确拦截规则
↓
👤 分析师
→ 人工确认

🎯 网空核心命题: 我们需要的不是 "哪个更好",而是 "哪个在什么情况下更适用"。

本部分总结 · 朴素贝叶斯

💡 核心思想 根据证据不断修正认知 —— 先验 → 似然 → 后验

🔑 关键区别 概率输出 — 不仅告诉结论,还告诉可信度

⚡ 核心优势 极快、小样本、高维友好、概率输出

🎯 网空定位 从 "确定性规则" 到 "概率性研判" 的认知跃迁

贝叶斯不做 "是/否" 判断,而是告诉你 "有多大把握" —— 概率让决策更有依据。

下一部分预告

🌲 孤立森林 · 异常的隔离 当恶意样本极度稀少,连 "钓鱼" 的规律都难以总结 —— 异常本身就是信号