如何计算极小数贝叶斯推理中的Pr(model|data) ?



我正在用Python做贝叶斯推理(手动使用网格搜索)。我想在给定数据的情况下计算每个模型的概率。问题是我只能用log来计算"证据",否则就是0。因此,即使它在0-1之间,我也无法得到

的结果
Pr(data|model1) / (Pr(data|model1) + Pr(data|model2))  

因为每一项在非对数形式下都是0。

任何想法?

谢谢

logpr1log(data|model1), logpr2log(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