2026 年 10 月
无标注也能发现群体 → 让数据自己 "抱团"
输出:簇与中心点
能圈出异常群体
只能回答 "谁和谁像",不能回答 "这一台有多可疑"
簇里的人是谁? 正常还是恶意? 还要靠人命名
研判要的是 "带可信度的结论",不是 "分组"
🚨 核心转折: 决策树给了 "规则",K-Means 给了 "分组" —— 但都不是 "有多大可能"。网空研判要的,是每一台主机有多大可能是威胁。
🎯 朴素贝叶斯: 在不确定性下做判断 —— 输出不是 "是/否",而是概率。
某部收到一批邮件,需要判定是否为钓鱼邮件。
📋 已知情报
| 情报 | 数据 |
|---|---|
| 历史钓鱼邮件比例 | 15%(先验概率) |
| 钓鱼邮件中含 "紧急" | 80% |
| 正常邮件中含 "紧急" | 10% |
❓ 待求解的问题
新邮件包含 "紧急" 字样
它是钓鱼邮件的概率 有多大?
🌳 规则法(决策树)会怎么做? "是否包含 '紧急' ?" → 是 → 判定为钓鱼 输出:是/否
📊 贝叶斯会怎么做? 用历史数据 + 贝叶斯公式 → 计算后验概率 输出:\(P(\text{钓鱼} \mid \text{紧急}) = ?\)
💡 本部分目标: 学会在不确定条件下,用概率而非规则来做判断。
人类在判断时,已经在潜意识里使用贝叶斯思想:
看到 "紧急" 这个词 ↓ 在脑中搜索:
钓鱼邮件中,有多少包含 "紧急" ?
正常邮件中,有多少包含 "紧急" ? ↓ 综合判断 → 直觉上觉得 "这封邮件有问题"
\(P(\text{钓鱼} \mid \text{紧急}) = \dfrac{P(\text{紧急} \mid \text{钓鱼}) \times P(\text{钓鱼})}{P(\text{紧急})}\)
符号对应直觉:
\(P(\text{钓鱼})\) → 以前见过钓鱼邮件吗?
\(P(\text{紧急} \mid \text{钓鱼})\) → 钓鱼邮件中 "紧急" 多吗?
\(P(\text{紧急})\) → "紧急" 本身常见吗?
💡 贝叶斯做的,就是把人类的这种直觉 "数学化" —— 用概率代替 "感觉",用公式代替 "大概"
| 维度 | 说明 |
|---|---|
| 输出 | 是/否 |
| 规则 | 如果 A 则 B |
| 本质 | 确定性逻辑 |
| 适用 | 有明确判据的场景 |
像 对答案
| 维度 | 说明 |
|---|---|
| 输出 | 87% 是恶意 |
| 规则 | 概率推理 |
| 本质 | 不确定性量化 |
| 适用 | 需要可信度的场景 |
像 打分
🎯 网空启示: 战场上,我们需要的往往不是 "是不是",而是 "有多大概率是" —— 后者更有决策价值。
先有一个初始判断(先验),看到新证据后更新判断(后验)。
💡 用新证据修正旧认知,让判断越来越接近真相。
\[ 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 \mid B) \) = 在 B 条件下 A 的概率(如:紧急邮件中钓鱼的比例)
\[ P(A \mid B) = \frac{P(A \cap B)}{P(B)} \] "在 B 条件下 A 的概率" = A 和 B 同时发生 ÷ B 发生
\[ P(A \cap B) = P(B \mid A) \times P(A) \] "A 和 B 同时发生" = 在 A 条件下 B 的概率 × A 的概率
\[ 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})} \]
💡 每一步都源于条件概率的定义,贝叶斯公式本身没有引入任何额外假设。
换个基线: 上文的机构先验是 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{中奖}) \),再算后验概率
📊 历史数据回顾:
| 类别 | 先验 | 含 "紧急" | 含 "中奖" |
|---|---|---|---|
| 钓鱼 | 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% — 所有邮件中同时包含 "紧急" 和 "中奖" 的比例
📊 历史数据回顾:
| 类别 | 先验 | 含 "紧急" | 含 "中奖" |
|---|---|---|---|
| 钓鱼 | 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% 概率是钓鱼邮件!
📊 中间计算(看到 "紧急" 时): \[ 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%
先验需要随威胁态势动态调整
⚠ 网空启示: 先验不是拍脑袋决定的 —— 它应该反映当前、本地的威胁态势,既是空间维度上需要本地化的基线水平,也是时间维度上需要动态更新的实时情报。
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
# 对新样本进行预测
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
...]
这是决策树做不到的:不仅告诉你答案,还告诉你 "有多大把握"。
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) 规则透明,每条判据可追溯
🎯 网空核心命题: 我们需要的不是 "哪个更好",而是 "哪个在什么情况下更适用"。
💡 核心思想 根据证据不断修正认知 —— 先验 → 似然 → 后验
🔑 关键区别 概率输出 — 不仅告诉结论,还告诉可信度
⚡ 核心优势 极快、小样本、高维友好、概率输出
🎯 网空定位 从 "确定性规则" 到 "概率性研判" 的认知跃迁
贝叶斯不做 "是/否" 判断,而是告诉你 "有多大把握" —— 概率让决策更有依据。
🌲 孤立森林 · 异常的隔离 当恶意样本极度稀少,连 "钓鱼" 的规律都难以总结 —— 异常本身就是信号