Skip to content

知识点卡片:贝叶斯公式

基本信息

属性内容
知识点条件概率与贝叶斯公式
掌握程度★★★★☆
学习优先级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, std

4. 贝叶斯优化

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的区别?

方面MLEMAP
目标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

相关知识点