第 17 章 贝叶斯后验计算

16 章中的两个例子都有解析后验。但在真实模型中,后验分布往往没有简单闭式形式。本章介绍几种基础计算策略:网格近似、MAP 估计、Laplace 近似和后验模拟。它们与前面章节的数值积分、优化和 Monte Carlo 方法紧密相连。

17.1 后验计算的目标

给定后验分布

\[ p(\theta\mid y)\propto p(y\mid\theta)p(\theta), \]

我们通常关心以下量:

  1. 后验均值 \(E(\theta\mid y)\)
  2. 后验标准差和可信区间;
  3. 后验众数,也称 MAP;
  4. 后验预测分布;
  5. 参数之间的相关性和不确定性传播。

这些量本质上都需要对后验分布做归纳。若无法解析计算,就需要数值方法。

17.2 网格近似

当参数只有一维或二维时,网格近似非常直观。选择一组候选点,在每个点计算未归一化后验密度,再把这些值标准化为离散概率。

下面考虑模拟企业月订单数。设

\[ y_i\mid\lambda\sim \operatorname{Poisson}(\lambda), \]

为了保证 \(\lambda>0\),令 \(\eta=\log\lambda\),并设先验

\[ \eta\sim N(1,1^2). \]

后验对数密度忽略常数后为

\[ \log p(\eta\mid y) = \left(\sum_{i=1}^n y_i\right)\eta -n\exp(\eta) -\frac{1}{2}(\eta-1)^2. \]

set.seed(2026)
y <- rpois(60, lambda = 3.5)
n <- length(y)
s <- sum(y)

log_post_eta <- function(eta) {
  s * eta - n * exp(eta) - 0.5 * (eta - 1)^2
}

grid <- seq(0, 2.5, length.out = 1000)
lp <- log_post_eta(grid)
w <- exp(lp - max(lp))
prob <- w / sum(w)

eta_mean <- sum(grid * prob)
lambda_mean <- sum(exp(grid) * prob)

c(eta_mean = eta_mean,
  lambda_mean = lambda_mean,
  lambda_q025 = exp(grid[which(cumsum(prob) >= 0.025)[1]]),
  lambda_q975 = exp(grid[which(cumsum(prob) >= 0.975)[1]]))
#>    eta_mean lambda_mean lambda_q025 lambda_q975 
#>       1.123       3.081       2.654       3.539

网格法的优点是透明,缺点是维度升高后迅速不可行。如果每个参数取 1000 个网格点,三个参数就需要\(10^9\) 个点。

17.3 MAP 估计

MAP(maximum a posteriori)估计是后验众数:

\[ \hat\theta_{\text{MAP}} = \arg\max_\theta p(\theta\mid y) = \arg\max_\theta \{\log p(y\mid\theta)+\log p(\theta)\}. \]

它可以用第 6 章的优化算法计算。对于上面的 Poisson 模型,我们最大化log_post_eta()

fit_map <- optim(par = log(mean(y)),
                 fn = function(e) -log_post_eta(e),
                 method = "BFGS",
                 hessian = TRUE)

eta_map <- fit_map$par
lambda_map <- exp(eta_map)
c(eta_map = eta_map, lambda_map = lambda_map)
#>    eta_map lambda_map 
#>      1.125      3.081

MAP 是一个点估计。它计算方便,也常作为更复杂算法的初始值。但只报告 MAP 会丢失后验不确定性。

17.4 Laplace 后验近似

在 MAP 附近,用二次函数近似对数后验,就得到正态近似。若

\[ H = - \left. \frac{\partial^2 \log p(\theta\mid y)} {\partial\theta^2} \right|_{\theta=\hat\theta_{\text{MAP}}}, \]

\[ \theta\mid y \approx N(\hat\theta_{\text{MAP}},H^{-1}). \]

在 Poisson 例子中,\(\eta\) 的二阶导数为

\[ \frac{\partial^2 \log p(\eta\mid y)}{\partial\eta^2} = -n\exp(\eta)-1. \]

hessian_neg <- n * exp(eta_map) + 1
eta_sd_laplace <- sqrt(1 / hessian_neg)

set.seed(1)
eta_draw <- rnorm(5000, mean = eta_map, sd = eta_sd_laplace)
lambda_draw <- exp(eta_draw)

c(lambda_mean_laplace = mean(lambda_draw),
  lambda_q025 = quantile(lambda_draw, 0.025),
  lambda_q975 = quantile(lambda_draw, 0.975))
#> lambda_mean_laplace    lambda_q025.2.5%   lambda_q975.97.5% 
#>               3.089               2.650               3.573

Laplace 近似把后验计算转化为优化和 Hessian 计算。它在样本量较大、后验近似单峰对称时效果较好。若后验偏斜、多峰或靠近边界,则需要更谨慎。

17.5 后验模拟与归纳

一旦获得后验样本

\[ \theta^{(1)},\ldots,\theta^{(S)}, \]

后验均值、标准差和区间都可以用样本统计量近似:

\[ E(\theta\mid y)\approx \frac{1}{S}\sum_{s=1}^S \theta^{(s)}. \]

后验概率也可以直接用比例估计。例如

\[ P(\lambda>4\mid y) \approx \frac{1}{S}\sum_{s=1}^S I(\lambda^{(s)}>4). \]

c(post_mean = mean(lambda_draw),
  post_sd = sd(lambda_draw),
  prob_lambda_gt_4 = mean(lambda_draw > 4))
#>        post_mean          post_sd prob_lambda_gt_4 
#>           3.0893           0.2326           0.0004

这种“用样本归纳后验”的思想会贯穿后续贝叶斯回归、后验预测和现代贝叶斯软件。

17.6 本章小结

后验计算的目标是从后验分布中得到均值、区间、概率和预测等可解释结果。网格法直观但难以扩展到高维;MAP 估计把后验计算转化为优化;Laplace 近似用 MAP 附近的二次形状构造正态近似;后验模拟则用样本平均近似后验积分。复杂模型中,这些方法常与 MCMC 或现代贝叶斯软件结合使用。

17.7 练习

  1. 修改 Poisson 例子中的先验均值和方差,观察后验均值变化。
  2. 用网格法计算 \(P(\lambda>4\mid y)\),并与 Laplace 模拟结果比较。
  3. 当样本量从 60 降到 5 时,比较网格后验和 Laplace 近似是否仍然接近。
  4. 解释为什么 MAP 不等于完整的贝叶斯推断。