You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取PyMC中ADVI拟合的正态后验分布的均值与标准差

PyMC提取ADVI直接拟合的正态后验均值与标准差实现方法

PyMC中ADVI拟合收敛后,变分结果对象本身就存储了近似正态后验的原生参数,无需通过采样样本间接计算,直接按以下步骤提取即可:

  • 完成ADVI拟合得到结果对象
    正常定义模型后调用pm.fit()执行ADVI,保留返回的拟合结果对象:

    import pymc as pm
    import numpy as np
    
    # 以下为模型示例,替换为你自己的模型逻辑即可
    data = np.random.normal(loc=2, scale=1, size=100)
    with pm.Model() as my_model:
        # 定义参数先验
        mu = pm.Normal("mu", mu=0, sigma=5)
        sigma = pm.HalfNormal("sigma", sigma=2)
        # 定义似然
        obs = pm.Normal("obs", mu=mu, sigma=sigma, observed=data)
        
        # 执行ADVI拟合,默认是平均场ADVI,即独立正态变分分布
        advi_res = pm.fit(method="advi", n=10000)
    
  • 直接提取拟合得到的后验均值、标准差
    拟合结果对象自带mean和std属性,对应ADVI优化得到的正态后验在无约束空间的均值和标准差,调用.eval()即可直接输出数值结果:

    # 提取后验均值,返回字典格式,key和模型定义的随机变量名一一对应
    posterior_means = advi_res.mean.eval()
    # 提取后验标准差
    posterior_stds = advi_res.std.eval()
    

    上述方法得到的参数是ADVI优化目标收敛后直接输出的变分分布参数,完全不依赖后续采样,不存在采样带来的随机误差。

  • 补充说明

    • 如果你使用的是全秩ADVI(method="fullrank_advi"),除均值、标准差外,还可通过advi_res.cov.eval()直接提取拟合得到的多元正态后验协方差矩阵。
    • 对于带取值约束的参数(比如上述示例中的sigma为HalfNormal分布,取值必须大于0),上述提取的是无约束变换空间的正态参数,若需要原约束空间的分布参数,可通过变分对象的内置变换方法做空间映射。
    • 不要通过advi_res.sample()生成近似样本后再计算统计量,该方式得到的是采样估计值,和变分分布的真实拟合参数存在随机偏差。

内容的提问来源于stack exchange,提问作者imk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:21:31