如何用极小数量计算贝叶斯推理中的Pr(模型|数据)?

时间:2015-10-03 09:14:18

标签: python numpy model statistics bayesian

我在Python中进行贝叶斯推理(手动,使用网格搜索)。我想计算给定数据的每个模型的概率。问题是我只能计算出来的证据'在日志中,否则为0。 所以,即使它在0-1之间,我也无法得到结果:

Pr(data|model1) / (Pr(data|model1) + Pr(data|model2))  

由于每个术语的非对数形式为0。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:2)

logpr1logpr2分别为log(data|model1)log(data|model2),并假设

In [57]: logpr1 = -802

In [58]: logpr2 = -800

如果你试图将这些表达为概率(不是概率的对数),你会得到0:

In [59]: np.exp(logpr2)
Out[59]: 0.0

现在你要计算

log(Pr(data|model1) / (Pr(data|model1) + Pr(data|model2))),

你也可以写成

log(Pr(data|model1)) - log(Pr(data|model1) + Pr(data|model2)).

对于最后一个学期,您可以使用函数numpy.logaddexp(这是此答案的基本提示;另请参阅scipy.misc.logsumexp)。所以你的计算是:

In [60]: logp = logpr1 - np.logaddexp(logpr1, logpr2)

In [61]: logp
Out[61]: -2.1269280110429918

在这种情况下,这个数字不是很小。实际上,您可以将其表达为一个简单的概率:

In [62]: np.exp(logp)
Out[62]: 0.11920292202211526