有没有办法提高 scipy.stats 函数norm.pdf 和 t.cdf 的精度?因为如果我这样做它就会起作用:
from scipy.stats import norm, t
norm.ppf(t.cdf(9, 140))
但是如果我执行以下操作,我会得到 pdf 的“inf”和 cdf 的“1.0”:
norm.ppf(t.cdf(10, 140))
提前致谢
正如您所观察到的,示例中的 CDF 与 64 位浮点数的
1.0
无法区分。但如果你想知道它有多接近 1.0
,你可以计算“生存函数”,它是 CDF 的补集。
from scipy import stats
dist = stats.t(140)
dist.sf(10) 2.1240715308683204e-18
# The CDF is ~2.124e-18 less than 1.0
您可以使用
ppf
(“逆生存函数”)来代替 cdf
(isf
的逆函数):
dist.isf(dist.sf(10)) # 10.000000000000007
如果不熟悉生存函数,使用分布关于原点对称的事实可能会更舒服。
dist.cdf(-10) 2.1240715308683204e-18
dist.ppf(dist.cdf(-10)) # -10.000000000000007
这将使您比正态分布的 37.5 sigma 更进一步(对于具有有限自由度的
t
更进一步)。之后,您所处理的数字小于 64 位浮点数可以直接表示的数字,但如果您习惯处理概率的对数,则可以走得更远。如果你有兴趣,LMK,我可以发布更多相关内容。