知识点卡片:贝叶斯公式
基本信息
| 属性 | 内容 |
|---|---|
| 知识点 | 条件概率与贝叶斯公式 |
| 掌握程度 | ★★★★☆ |
| 学习优先级 | P1 |
| 预估时间 | 6小时 |
| 面试频率 | ★★★☆☆ |
核心原理
条件概率
P(A|B) = P(A, B) / P(B) 当 P(B) > 0
联合概率:P(A, B) = P(A|B) * P(B) = P(B|A) * P(A)贝叶斯公式
P(A|B) = P(B|A) * P(A) / P(B)
其中:
- P(A|B):后验概率 (Posterior)
- P(B|A):似然 (Likelihood)
- P(A):先验概率 (Prior)
- P(B):归一化常数 (Evidence)
核心思想:用新的观测数据(B)来更新对事件(A)的信念在深度学习中的应用
1. 朴素贝叶斯分类器
python
import numpy as np
from sklearn.naive_bayes import GaussianNB, MultinomialNB
# 高斯朴素贝叶斯(连续特征)
gnb = GaussianNB()
gnb.fit(X_train, y_train)
pred = gnb.predict(X_test)
proba = gnb.predict_proba(X_test) # 后验概率
# 多项式朴素贝叶斯(文本分类)
mnb = MultinomialNB()
mnb.fit(X_train_counts, y_train)2. MLE vs MAP(先验的作用)
python
"""
MLE(最大似然估计):
θ_MLE = argmax_θ P(D|θ)
→ 只考虑数据,不考虑先验
MAP(最大后验估计):
θ_MAP = argmax_θ P(θ|D) = argmax_θ P(D|θ) * P(θ)
= argmax_θ log P(D|θ) + log P(θ)
当先验 P(θ) 是:
- 高斯分布 → log P(θ) = -λ‖θ‖² → L2正则化
- Laplace分布 → log P(θ) = -λ‖θ‖₁ → L1正则化
结论:正则化 = 在参数上施加先验分布!
"""3. Dropout的贝叶斯解释
python
"""
Dropout可以视为一种近似贝叶斯推断:
- 训练时随机丢弃神经元 ≈ 从后验分布采样
- 推理时保留所有神经元 ≈ 模型平均
- MC Dropout:推理时也保留dropout,多次采样取平均
这相当于贝叶斯模型平均,用于不确定性估计
"""
import torch
import torch.nn as nn
def mc_dropout_predict(model, x, n_samples=100):
"""MC Dropout 不确定性估计"""
model.train() # 保持dropout开启
predictions = []
for _ in range(n_samples):
with torch.no_grad():
pred = model(x)
predictions.append(pred)
predictions = torch.stack(predictions)
mean = predictions.mean(dim=0) # 预测均值
std = predictions.std(dim=0) # 不确定性
return mean, std4. 贝叶斯优化
python
"""
用于超参数调优的贝叶斯优化:
1. 使用高斯过程作为先验
2. 观测新的超参数-效果对
3. 更新后验(贝叶斯公式)
4. 使用采集函数选择下一个超参数
"""
from sklearn.gaussian_process import GaussianProcessRegressor
# 高斯过程作为代理模型
gp = GaussianProcessRegressor()
# 贝叶斯优化循环
for i in range(n_iterations):
# 1. 用现有数据拟合GP(得到后验)
gp.fit(observed_params, observed_scores)
# 2. 用采集函数选下一个点
next_param = acquisition_function(gp, param_space)
# 3. 评估并添加观测
score = evaluate_model(next_param)
observed_params = np.vstack([observed_params, next_param])
observed_scores = np.append(observed_scores, score)面试高频问题
Q1: MLE和MAP的区别?
答:
| 方面 | MLE | MAP |
|---|---|---|
| 目标 | max P(D|θ) | max P(θ|D) = P(D|θ)·P(θ) |
| 先验 | 无 | 有 |
| 正则化 | 无 | 等价于加正则化 |
| 数据量影响 | 总是受数据影响 | 数据少时受先验影响大 |
| 点估计 | 是 | 是 |
| 不确定性 | 不考虑 | 通过先验间接考虑 |
Q2: 如何从贝叶斯角度理解正则化?
答:
L2正则化:先验 w ~ N(0, σ²),log P(w) = -‖w‖²/(2σ²) + const
→ 最大化后验 = 最小化 [-log P(D|w) + λ‖w‖²]
→ λ = 1/(2σ²),先验方差越小则惩罚越强
L1正则化:先验 w ~ Laplace(0, b),log P(w) = -‖w‖₁/b + const
→ 最大化后验 = 最小化 [-log P(D|w) + λ‖w‖₁]
→ Laplace先验使后验在0处有尖峰,产生稀疏解代码练习
python
import numpy as np
# 1. 实现贝叶斯分类器
def bayesian_classifier(X_train, y_train, X_test):
"""简单的贝叶斯分类器"""
classes = np.unique(y_train)
n_classes = len(classes)
n_test = len(X_test)
scores = np.zeros((n_test, n_classes))
for i, c in enumerate(classes):
X_c = X_train[y_train == c]
# 先验 P(C)
prior = len(X_c) / len(y_train)
# 似然 P(X|C) 假设高斯分布
mean = X_c.mean(axis=0)
std = X_c.std(axis=0) + 1e-10
likelihood = np.exp(-0.5 * ((X_test - mean) / std) ** 2) / (std * np.sqrt(2 * np.pi))
likelihood = likelihood.prod(axis=1)
# 后验 ∝ 似然 × 先验
scores[:, i] = likelihood * prior
return classes[scores.argmax(axis=1)]
# 2. 验证先验的影响
def map_vs_mle_l2(X, y, lambda_val=1.0):
"""对比MLE和MAP(L2)的解"""
n, d = X.shape
# MLE: w = (X^T X)^-1 X^T y
w_mle = np.linalg.solve(X.T @ X, X.T @ y)
# MAP(L2): w = (X^T X + λI)^-1 X^T y
w_map = np.linalg.solve(X.T @ X + lambda_val * np.eye(d), X.T @ y)
print(f"MLE: ‖w‖ = {np.linalg.norm(w_mle):.4f}")
print(f"MAP(L2): ‖w‖ = {np.linalg.norm(w_map):.4f}")
return w_mle, w_map