在python中计算正常样本在某个时间间隔内落下的概率日志时防止下溢

在python中计算正常样本在某个时间间隔内落下的概率日志时防止下溢,python,numpy,normal-distribution,numerical-computing,Python,Numpy,Normal Distribution,Numerical Computing,给定两个realx和y,我想用python计算以下函数: log Pr [ x <= t <= y ], 不幸的是,当x和y远离0时,这会导致下溢。 如何防止这种数值错误?如果在日志空间中进行,这个问题会更加稳定 诀窍是对小于零的值使用scipy.stats.norm.logcdf,对大于零的值使用scipy.stats.norm.logsf 这与计算log(exp(y)-exp(x))的稳定算法相结合,给出了合理的结果 import numpy as np from scipy.

给定两个real
x
y
,我想用python计算以下函数:

log Pr [ x <= t <= y ],
不幸的是,当
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))
将numpy导入为np
从scipy.stats导入norm
def log_减法(x,y):
返回x+np.log1p(-np.exp(y-x))
def lnprob(x,y):
如果x<0:
返回log_减法(norm.logcdf(y),norm.logcdf(x))
其他:
返回log_减法(norm.logsf(x),norm.logsf(y))
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))