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