如何用极小的数字计算贝叶斯推理中的 Pr(model|data)?
How do I calculate Pr(model|data) in Bayesian inference with extremely small numbers?
我在 Python 中进行贝叶斯推理(手动,使用网格搜索)。我想计算给定数据的每个模型的概率。问题是我只能计算日志中的'evidence',否则为0。
因此,即使它介于 0-1 之间,我也无法获得以下结果:
Pr(data|model1) / (Pr(data|model1) + Pr(data|model2))
因为每一项在其非对数形式下都是 0。
有什么想法吗?
谢谢
设logpr1
和logpr2
分别为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
(which is the essential tip in this answer; see also 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
我在 Python 中进行贝叶斯推理(手动,使用网格搜索)。我想计算给定数据的每个模型的概率。问题是我只能计算日志中的'evidence',否则为0。 因此,即使它介于 0-1 之间,我也无法获得以下结果:
Pr(data|model1) / (Pr(data|model1) + Pr(data|model2))
因为每一项在其非对数形式下都是 0。
有什么想法吗?
谢谢
设logpr1
和logpr2
分别为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
(which is the essential tip in this answer; see also 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