対称性を利用するという@HongOoiの提案は素晴らしいです。しかし、scipy.stats
( を含む) の任意の分布の場合、この方法を正確にこの計算にnorm
使用できます。は関数の名前であるサバイバル関数の略です。logsf
sf
1 - cdf(x)
例えば、
In [25]: import numpy as np
In [26]: from scipy.stats import norm, gamma
次に例を示しnorm.logsf
ます。
In [27]: norm.logsf(3, loc=1, scale=1.5)
Out[27]: -2.3945773661586434
In [28]: np.log(1 - norm.cdf(3, loc=1, scale=1.5))
Out[28]: -2.3945773661586434
そして、ここに例がありgamma.logsf
ます:
In [29]: gamma.logsf(1.2345, a=2, scale=1.8)
Out[29]: -0.16357333194167956
In [30]: np.log(1 - gamma.cdf(1.2345, a=2, scale=1.8))
Out[30]: -0.16357333194167956
logsf(x)
これは、の代わりに使用する理由を示していますlog(1 - cdf(x))
。
In [35]: norm.logsf(50, loc=1, scale=1.5)
Out[35]: -537.96178420294677
In [36]: np.log(1 - norm.cdf(50, loc=1, scale=1.5))
/Users/warren/miniconda3scipy/bin/ipython:1: RuntimeWarning: divide by zero encountered in log
#!/Users/warren/miniconda3scipy/bin/python
Out[36]: -inf