3

给定两个实数xy,我想在 python 中计算以下函数:

log Pr [ x <= t <= y ],

其中t是从正态分布中采样的。

一种天真的实现是使用scipy.stats.norm.

np.log(scipy.stats.norm.cdf(y) - scipy.stats.norm.cdf(x))

不幸的是,这会在xy远离时导致下溢0。如何防止这样的数字错误?

4

1 回答 1

2

如果在日志空间中完成,这个问题会稳定得多。

诀窍是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))
于 2016-05-17T08:33:02.300 回答