跳转至

6.3   极大似然估计

小率从口袋里摸出 10 张实验卡:7 张写着“正”,3 张写着“反”。这是他刚做的硬币实验。

他问均哥:如果这枚硬币正面朝上的概率是 \(p\),那看到“7 正 3 反”以后,最合理的 \(p\) 应该是多少?

图 6.3.0 小率用 7 正 3 反追问 MLE

哪个 p 最像这次数据

极大似然估计(Maximum Likelihood Estimation, MLE)的核心不是“参数给定后数据会怎样”,而是“数据已经发生后,哪个参数最能解释它”。

如果我看到 7 次正面,那直接说 $p=0.7$ 会不会太草率?
直觉上没错。MLE 要做的,就是把这个直觉写成一个可计算的打分规则。

6.3.1   概率和似然只是视角不同

先看概率。若参数 \(p\) 已知,比如 \(p=0.5\),我们可以问:

抛 10 次,出现 7 正 3 反的概率是多少?

这时变量是“数据”。

现在反过来。数据已经固定为 7 正 3 反,我们把 \(p\) 当成候选值,一个一个评分:

  • \(p=0.3\):很难解释 7 次正面,分数低。
  • \(p=0.5\):还能解释,分数中等。
  • \(p=0.7\):最符合这次结果,分数最高。

这种把数据固定、给参数打分的函数,就是 似然函数(Likelihood Function)

图 6.3.1 用似然给不同参数打分

概率 vs 似然

概率是 \(P(\text{数据}\mid\text{参数})\),把参数当已知,问数据会不会出现。似然是 \(L(\text{参数}\mid\text{数据})\),把数据当已知,问哪个参数更像。

公式好像一样,只是谁被固定变了?
正是这一下视角翻转,让参数估计从“猜”变成了“优化”。

6.3.2   伯努利例子:7 正 3 反

把正面记为 1,反面记为 0。若 \(X_i\sim\operatorname{Bernoulli}(p)\),10 次里有 \(k=7\) 次正面,那么似然函数是:

\[ L(p)=p^k(1-p)^{n-k} \]

代入 \(n=10,k=7\)

\[ L(p)=p^7(1-p)^3 \]

为了方便求最大值,常取对数:

\[ \ell(p)=7\log p+3\log(1-p) \]

\(p\) 求导并令其为 0:

\[ \frac{d\ell}{dp}=\frac{7}{p}-\frac{3}{1-p}=0 \]

解得:

\[ \hat p_{\text{MLE}}=\frac{7}{10}=0.7 \]
所以 0.7 不是拍脑袋,是让似然函数最大的点。
对。MLE 的答案永远来自“最大化似然”。

6.3.3   MLE 的四步套路

多数模型都可以按同一套路走:

  1. 写出单个观测的概率或密度 \(f(x_i\mid\theta)\)
  2. 假设样本独立,把它们相乘得到似然:
\[ L(\theta)=\prod_{i=1}^{n}f(x_i\mid\theta) \]
  1. 取对数,把乘法变加法:
\[ \ell(\theta)=\sum_{i=1}^{n}\log f(x_i\mid\theta) \]
  1. 找到让 \(\ell(\theta)\) 最大的参数:
\[ \hat\theta_{\text{MLE}}=\arg\max_{\theta}\ell(\theta) \]

为什么常用对数似然

对数函数单调递增,所以最大化 \(L(\theta)\) 和最大化 \(\ell(\theta)=\log L(\theta)\) 的位置相同。取对数后,乘积变成求和,数值也更稳定。


6.3.4   正态和泊松也能套同一招

如果 \(X_i\sim N(\mu,\sigma^2)\),极大似然估计会给出:

\[ \hat\mu_{\text{MLE}}=\bar X \]

以及

\[ \hat\sigma^2_{\text{MLE}}=\frac{1}{n}\sum_{i=1}^{n}(X_i-\bar X)^2 \]

注意这里方差分母是 \(n\),不是 \(n-1\)。这说明 MLE 并不保证无偏,它追求的是“让观测数据最像”的参数。

如果 \(X_i\sim \operatorname{Poisson}(\lambda)\),极大似然估计是:

\[ \hat\lambda_{\text{MLE}}=\bar X \]
很多答案又回到样本均值了。
常见模型里确实经常这样。但你要记住,原则不是“都用均值”,而是“最大化似然”。

6.3.5   用 Python 画出 7 正 3 反的似然

import numpy as np

n = 10
k = 7
p_grid = np.linspace(0.01, 0.99, 99)
log_likelihood = k * np.log(p_grid) + (n - k) * np.log(1 - p_grid)

p_hat = p_grid[np.argmax(log_likelihood)]
print(f"MLE p̂ = {p_hat:.2f}")

完整脚本见:

# docs/assets/scripts/ch06_estimation/03_mle/main.py

模型设错,MLE 也会跟着错

MLE 很强,但它依赖你先写出一个合理的概率模型。若硬币实验不是独立的,或者数据来自完全不同机制,再漂亮的似然最大化也会给出误导性的答案。

小率的笔记本

MLE 的核心是:把数据固定,给不同参数打分,选择分数最高的参数。概率看 \(P(\text{数据}\mid\text{参数})\),似然看 \(L(\text{参数}\mid\text{数据})\)。常用流程是写似然、取对数、求最大值。