PyMC3 中的贝叶斯模型选择

机器算法验证 贝叶斯 模型选择 pymc
2022-03-21 16:01:34

我正在使用 PyMC3 对我的数据运行贝叶斯模型。

我是贝叶斯建模的新手,但根据该站点的一些博客文章、维基百科和QA,使用贝叶斯因子和 BIC 标准来选择最能代表我的数据的模型似乎是一种有效的方法(生成我的数据)。

为了计算贝叶斯因子,我需要我想要比较的模型的相对似然。这对我来说可能有点困惑,但我认为有两种方法可以获得可能性(如果我错了,请纠正我):

  • 模型简单时的代数方式:参见维基百科示例贝叶斯因子页面

  • 数字方式:这就是 PyMC3 与 MCMC 算法的关系

如何访问可能性并在 PyMC3 中比较我的模型?我发现model.logp根据文档的方法是“对数概率密度函数”。我可以用它来获得可能性吗?

额外的问题:当比较两个模型时,计算两个可能性之间的比率。如果你想比较几个模型会发生什么?

一个具体的 PyMC3 示例将非常有帮助!

1个回答

您可以使用 model.logp() 计算模型的可能性。作为输入,它需要一个点。例如,我可以做的示例目录中的 BEST 模型:

np.exp(model.logp({'group1_mean': 0.1, 
                   'group2_mean': 0.2, 
                   'group1_std_interval': 1., 
                   'group2_std_interval': 1.2, 
                   'nu_minus_one_log': 1}))

请注意,此模型使用转换后的变量,因此我必须提供这些。然后,您可以使用 exp() 并在数值积分器中使用它,例如 scipy.integrate 提供的。问题是即使只有 5 个参数,这也会很慢。

贝叶斯因子通常很难计算,因为您必须在整个参数空间上进行积分。为此使用 MCMC 样本有一些想法。请参阅此帖子,尤其是评论部分以获取更多信息:https ://radfordneal.wordpress.com/2008/08/17/the-harmonic-mean-of-the-likelihood-worst-monte-carlo-method-ever /不幸的是,BIC 的情况类似。

如果您真的想计算贝叶斯因子,您还可以查看 Savage Dickey Ratio 测试(参见例如http://drsmorey.org/bibtex/upload/Wagenmakers:etal:2010.pdf),但它的应用程序是有限的。

我想您正在尝试进行模型比较,这是一个具有许多意见和解决方案的领域(有些难以实施,例如 BF)。一种非常容易计算的度量是偏差信息准则。它有其缺点,尽管其中一些可以补救(参见http://onlinelibrary.wiley.com/doi/10.1111/rssb.12062/abstract)。不幸的是,我们还没有移植代码 pymc3,但这很容易(参见此处了解 pymc2 实现:https ://github.com/pymc-devs/pymc/blob/895c24f62b9f5d786bce7ac4fe88edb4ad220364/pymc/MCMC.py# L410 )。

Kruschke 喜欢只构建完整模型并让它告诉你哪些参数很重要的方法。您还可以在模型本身中构建变量选择(参见例如http://arxiv.org/pdf/math/0505633.pdf)。

最后,对于更完整的处理,请参阅最近的博客文章:http: //jakevdp.github.io/blog/2015/08/07/frequentism-and-bayesianism-5-model-selection/