给定两个实数x
和y
,我想在 python 中计算以下函数:
log Pr [ x <= t <= y ],
其中t
是从正态分布中采样的。
一种天真的实现是使用scipy.stats.norm
.
np.log(scipy.stats.norm.cdf(y) - scipy.stats.norm.cdf(x))
不幸的是,这会在x
和y
远离时导致下溢0
。如何防止这样的数字错误?
给定两个实数x
和y
,我想在 python 中计算以下函数:
log Pr [ x <= t <= y ],
其中t
是从正态分布中采样的。
一种天真的实现是使用scipy.stats.norm
.
np.log(scipy.stats.norm.cdf(y) - scipy.stats.norm.cdf(x))
不幸的是,这会在x
和y
远离时导致下溢0
。如何防止这样的数字错误?
如果在日志空间中完成,这个问题会稳定得多。
诀窍是scipy.stats.norm.logcdf
用于小于零scipy.stats.norm.logsf
的值和大于零的值。
这与一个稳定的计算算法相结合,log(exp(y) - exp(x))
给出了合理的结果
import numpy as np
from scipy.stats import norm
def log_subtract(x, y):
return x + np.log1p(-np.exp(y-x))
def lnprob(x, y):
if x < 0:
return log_subtract(norm.logcdf(y), norm.logcdf(x))
else:
return log_subtract(norm.logsf(x), norm.logsf(y))