学生 cdf 和普通 ppf 精度

问题描述 投票:0回答:1

有没有办法提高 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))

提前致谢

scipy python-3.7 precision scipy.stats
1个回答
0
投票

正如您所观察到的,示例中的 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,我可以发布更多相关内容。

© www.soinside.com 2019 - 2024. All rights reserved.