4. 极大似然估计(MLE)与贝叶斯估计

参数估计这件事,说白了就是「从数据反推模型参数」。但怎么反推?不同学派有不同玩法。频率学派喜欢极大似然估计(MLE),贝叶斯学派则把参数也当成随机变量。这两种思路我都用过,今天跟你聊聊它们的核心区别和实战选择。

4.1 极大似然估计(MLE)原理

MLE 的思想很直观:找一组参数,让当前观测数据出现的概率最大。你想想看,如果模型参数是 θ,观测数据是 D,那似然函数就是 P(D|θ)。MLE 就是求:

θ_MLE = argmax P(D|θ)

实际计算时,我们通常取对数,把连乘变成连加——这叫对数似然。因为对数函数单调递增,最大化对数似然等价于最大化原始似然。

核心公式:对于独立同分布数据 D = {x₁, x₂, ..., xₙ},

L(θ) = ∏ P(xᵢ|θ)
log L(θ) = ∑ log P(xᵢ|θ)
θ_MLE = argmax log L(θ)

举个例子。假设我们要估计一个高斯分布的均值和方差。观测数据是 10 个点:

import numpy as np

data = np.array([2.1, 2.3, 1.9, 2.2, 2.0, 2.4, 1.8, 2.1, 2.2, 2.0])

# MLE 估计
mu_mle = np.mean(data)        # 2.1
sigma_mle = np.std(data, ddof=0)  # 0.174

print(f"均值 MLE: {mu_mle:.3f}")
print(f"标准差 MLE: {sigma_mle:.3f}")

结果很直观——样本均值就是均值 MLE,样本标准差(除以 n)就是标准差 MLE。我在做传感器标定时经常用这个,简单粗暴,效果还不错。

4.2 MLE 与最小二乘(LS)的关系

很多人问我:MLE 和最小二乘到底啥关系?答案是:在特定假设下,它们等价。

考虑线性回归模型:y = Xθ + ε,其中 ε 是高斯噪声,均值为 0,方差为 σ²。那么:

  • 似然函数 P(y|X,θ) 是高斯分布
  • 对数似然:log P(y|X,θ) = -n/2 log(2πσ²) - 1/(2σ²) ||y - Xθ||²
  • 最大化对数似然 → 最小化 ||y - Xθ||² → 最小二乘

我的经验:当噪声是高斯分布时,MLE 和 LS 给出相同结果。但噪声不是高斯时(比如有离群点),两者就分道扬镳了。我曾在机器人定位数据中遇到过非高斯噪声,用 LS 估计出来的参数偏差很大,换成 MLE 配合 t 分布才搞定。

下表总结了 MLE 和 LS 的关键区别:

对比维度 MLE LS
理论基础 概率论 代数优化
噪声假设 需要显式指定 隐含高斯假设
鲁棒性 可灵活选择分布 对离群点敏感
计算复杂度 可能需迭代求解 有闭式解
适用场景 已知噪声分布 快速原型验证

4.3 贝叶斯估计框架

贝叶斯学派换了个角度:参数 θ 本身也是随机变量。我们不是找「最可能」的参数值,而是计算参数的后验分布。

核心公式就是贝叶斯定理:

P(θ|D) = P(D|θ) * P(θ) / P(D)

其中:
- P(θ|D) 是后验分布(看到数据后对参数的认知)
- P(D|θ) 是似然(数据出现的概率)
- P(θ) 是先验分布(看到数据前对参数的认知)
- P(D) 是证据(归一化常数)

我个人习惯把贝叶斯估计看作「先验 + 数据 → 后验」的更新过程。先验代表我们的初始信念,数据不断修正这个信念。

注意:P(D) 通常很难直接计算,因为它需要对所有可能的 θ 积分。实际应用中,我们往往只关心后验的形状,或者用采样方法(如 MCMC)来近似。

4.4 先验与后验

先验分布是贝叶斯估计的「灵魂」。选对了先验,小样本也能得到合理估计;选错了,结果可能比 MLE 还差。

常见的先验类型:

  • 无信息先验:均匀分布,表示我们对参数一无所知
  • 共轭先验:后验和先验属于同一分布族,计算方便
  • 信息先验:基于历史数据或专家知识

举个例子。估计硬币正面概率 p,观测到 3 次正面 7 次反面:

# 共轭先验:Beta 分布
# 先验:Beta(2, 2) 表示我们认为硬币大致均匀
# 后验:Beta(2+3, 2+7) = Beta(5, 9)

import numpy as np
from scipy import stats

# 先验
prior = stats.beta(2, 2)
# 后验
posterior = stats.beta(5, 9)

# 后验均值
posterior_mean = posterior.mean()  # 0.357
# MLE 估计
mle_estimate = 3/10  # 0.3

print(f"后验均值: {posterior_mean:.3f}")
print(f"MLE 估计: {mle_estimate:.3f}")

你看,后验均值(0.357)比 MLE(0.3)更靠近 0.5——这就是先验在「拉」着估计值。数据量越大,这个拉力越弱。

4.5 最大后验估计(MAP)

MAP 是 MLE 和贝叶斯估计的「混血儿」。它不计算完整的后验分布,只找后验分布的峰值:

θ_MAP = argmax P(θ|D) = argmax P(D|θ) * P(θ)

注意,分母 P(D) 与 θ 无关,可以省略。取对数后:

θ_MAP = argmax [log P(D|θ) + log P(θ)]

跟 MLE 相比,MAP 多了一项 log P(θ)——先验的对数。这相当于给 MLE 的目标函数加了一个正则化项。

关键洞察:

  • MLE = MAP 在均匀先验下的特例
  • 高斯先验 → L2 正则化(岭回归)
  • 拉普拉斯先验 → L1 正则化(Lasso)

我在做机器人动力学参数辨识时,经常用 MAP 配合高斯先验。因为有些参数(比如关节摩擦力)有物理约束,先验能帮我把估计值「拉」到合理范围内。

避坑指南:我曾经在样本量很小时直接用 MLE,结果估计出来的参数完全不符合物理规律。后来换成 MAP,加了个弱先验,结果就靠谱多了。记住:小样本用 MAP,大样本用 MLE——数据量大了,先验的影响自然就小了。

4.6 三种方法的对比

方法 输出 需要先验 计算量 小样本表现
MLE 点估计 否 低 可能过拟合
MAP 点估计 是 中 有正则化效果
贝叶斯 分布估计 是 高 不确定性量化好

选择建议:

  • 数据量大、噪声高斯 → MLE(简单高效)
  • 小样本、有先验知识 → MAP(平衡先验和数据)
  • 需要不确定性量化 → 贝叶斯(完整后验分布)
参数估计方法体系 参数估计 频率学派 贝叶斯学派 MLE(极大似然) LS(最小二乘) MAP(最大后验) 贝叶斯估计 均匀先验时等价 选择建议 大样本 + 高斯噪声 → MLE/LS 小样本 + 先验知识 → MAP | 需要不确定性 → 贝叶斯

嗯,以上就是 MLE、贝叶斯估计和 MAP 的核心内容。实际项目中,我通常先用 MLE 快速跑一遍,看看数据质量;如果结果不对劲,再切换到 MAP 加先验约束。记住:没有万能的方法,只有适合场景的工具。