共轭先验完整推导

概述

共轭先验(Conjugate Prior)是贝叶斯统计中的核心概念12。当先验分布与似然函数共轭时,后验分布与先验分布属于同一分布族,这极大地简化了贝叶斯推断的计算。

核心思想:选择先验分布使得后验分布与先验分布具有相同的函数形式。


1. 共轭性的定义

1.1 数学定义

设似然函数为 ,先验分布为 。如果后验分布

与先验 属于同一分布族,则称 共轭先验

1.2 指数族视角

指数族分布具有自然的共轭结构3

其中 是自然参数, 是充分统计量。

共轭先验的形式为:


2. 伯努利/二项模型

2.1 问题设置

,即:

似然函数:

其中 是成功次数。

2.2 Beta先验

Beta分布定义

其中

2.3 后验推导

先验

似然

后验

因此:

2.4 更新公式

参数更新公式
先验
后验

超参数的物理意义

  • :先验成功次数的”伪计数”
  • :先验失败次数的”伪计数”

2.5 后验预测分布

新观测的后验预测分布:

这称为后验均值估计


3. 多项/Dirichlet模型

3.1 问题设置

,即:

约束:

3.2 Dirichlet先验

Dirichlet分布定义

其中

3.3 后验推导

先验

似然,其中 是类别 的计数

后验

因此:

3.4 均匀Dirichlet的特殊性质

(均匀先验)时:

后验仍为Dirichlet,其参数为

与拉普拉斯平滑的关系

时,这就是拉普拉斯平滑。


4. 泊松模型

4.1 问题设置

,即:

似然函数:

4.2 Gamma先验

Gamma分布定义

其中 是形状参数, 是率参数(或 是尺度参数)。

4.3 后验推导

先验

似然

后验

因此:

4.4 更新公式

参数更新公式
先验
后验

4.5 后验均值

这是先验均值和样本均值的加权平均


5. 指数模型

5.1 问题设置

,即:

似然函数:

5.2 共轭先验

指数分布的共轭先验也是Gamma分布:

5.3 后验


6. 正态模型

6.1 已知方差,估计均值

,其中 已知。

似然函数

正态先验

后验推导

其中:

6.2 已知均值,估计方差

,其中 已知。

逆Gamma先验

后验

6.3 均值和方差都未知

Normal-Inverse-Gamma先验

后验

其中:


7. 共轭先验完整表

7.1 离散分布

似然先验后验参数后验
Bernoulli()Beta()
Beta
Binomial()Beta()
Beta
Poisson()Gamma()
Gamma
Multinomial()Dir()Dir
Geometric()Beta()
Beta

7.2 连续分布

似然先验后验参数后验
Normal(), 已知
Normal
Normal(), 已知Inv-Gamma()
Inv-Gamma
Normal(), 都未知N-IG()见正文N-IG
Exponential()Gamma()
Gamma

8. 共轭先验的Python实现

import numpy as np
from scipy import stats
from scipy.special import gammaln, betaln
 
class ConjugateUpdate:
    """共轭先验更新实现"""
    
    @staticmethod
    def beta_binomial_update(alpha, beta, successes, trials):
        """
        Beta-Binomial共轭更新
        
        参数:
            alpha, beta: 先验参数
            successes: 成功次数 k
            trials: 试验次数 n
        
        返回:
            后验参数 (alpha', beta')
        """
        return alpha + successes, beta + trials - successes
    
    @staticmethod
    def dirichlet_multinomial_update(alpha, counts):
        """
        Dirichlet-Multinomial共轭更新
        
        参数:
            alpha: 先验参数向量
            counts: 各类别计数
        
        返回:
            后验参数向量
        """
        return alpha + counts
    
    @staticmethod
    def gamma_poisson_update(alpha, beta, observations):
        """
        Gamma-Poisson共轭更新
        
        参数:
            alpha, beta: 先验参数
            observations: 观测数据
        
        返回:
            后验参数 (alpha', beta')
        """
        return alpha + np.sum(observations), beta + len(observations)
    
    @staticmethod
    def normal_known_var_update(mu0, sigma0_sq, sigma_sq, observations):
        """
        已知方差的正态均值估计的共轭更新
        
        参数:
            mu0, sigma0_sq: 先验均值和方差
            sigma_sq: 已知方差
            observations: 观测数据
        
        返回:
            后验均值和方差
        """
        n = len(observations)
        x_bar = np.mean(observations)
        
        sigma_n_sq = 1 / (1/sigma0_sq + n/sigma_sq)
        mu_n = sigma_n_sq * (mu0/sigma0_sq + n*x_bar/sigma_sq)
        
        return mu_n, sigma_n_sq
    
    @staticmethod
    def normal_unknown_var_update(mu0, kappa0, alpha0, beta0, observations):
        """
        均值和方差都未知的正态模型的共轭更新
        
        参数:
            mu0, kappa0, alpha0, beta0: N-IG先验参数
            observations: 观测数据
        
        返回:
            后验N-IG参数
        """
        n = len(observations)
        x = np.array(observations)
        x_bar = np.mean(x)
        
        kappa_n = kappa0 + n
        mu_n = (kappa0 * mu0 + n * x_bar) / kappa_n
        
        alpha_n = alpha0 + n / 2
        
        # 分解为两部分
        ss_between = kappa0 * n * (x_bar - mu0)**2 / (2 * kappa_n)
        ss_within = np.sum((x - x_bar)**2) / 2
        beta_n = beta0 + ss_between + ss_within
        
        return mu_n, kappa_n, alpha_n, beta_n
 
 
class PosteriorPredictive:
    """后验预测分布"""
    
    @staticmethod
    def beta_binomial_predictive(alpha, beta, n, x):
        """
        Beta-Binomial后验预测分布
        
        P(X=x | D) = C(n,x) * B(alpha+x, beta+n-x) / B(alpha, beta)
        """
        return (betaln(alpha + x, beta + n - x) - betaln(alpha, beta) + 
                np.log(np.math.comb(n, x)))
    
    @staticmethod
    def dirichlet_multinomial_predictive(alpha, n, x):
        """
        Dirichlet-Multinomial后验预测分布
        """
        return (np.sum([betaln(alpha_j + x_j, alpha_sum + n - alpha_sum_j) 
                        for alpha_j, x_j in zip(alpha, x)]) -
                betaln(alpha, alpha).sum() +
                gammaln(alpha.sum() + n) - gammaln(alpha.sum()))

9. 先验选择的实践指南

9.1 无信息先验

模型Jeffreys先验
Bernoulli
Poisson
Normal()

9.2 经验贝叶斯

通过数据估计超参数:

9.3 共轭先验的局限性

问题解决方案
表达力有限使用混合先验
不适用于复杂模型变分推断、MCMC
可能过于主观敏感性分析

10. 总结

共轭先验的优势

  1. 计算简便:后验分布有解析形式
  2. 在线学习:新数据可逐步更新
  3. 可解释性:超参数有直观意义
  4. 计算效率:适合大规模应用

何时使用

  • 需要快速贝叶斯推断
  • 在线学习场景
  • 作为更复杂方法的近似
  • 先验信息明确时

何时不使用

  • 需要非共轭先验表达复杂信念
  • 模型高度非线性
  • 后验分布非标准形式

参考资料


相关主题

Footnotes

  1. Gelman, A., et al. (2013). “Bayesian Data Analysis.” CRC Press.

  2. Bernardo, J. M., & Smith, A. F. M. (2009). “Bayesian Theory.” Wiley.

  3. Diaconis, P., & Ylvisaker, D. (1979). “Conjugate Priors for Exponential Families.” The Annals of Statistics.