scipy 学生CDF和正常PPF精度

yeotifhr  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(73)

有没有办法提高scipy.stats函数norm.pdf和t.cdf的精度?因为如果我这样做,它就可以工作了:

from scipy.stats import norm, t
norm.ppf(t.cdf(9, 140))

字符串
但如果我做了以下操作,我得到了“inf”的pdf和“1.0”的cdf:

norm.ppf(t.cdf(10, 140))


Thanks in advance

i2byvkas

i2byvkas1#

正如你所观察到的,你的例子中的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

字符串
代替ppfcdf的逆),你可以使用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位浮点数可以直接表示的数字更小的数字,但是如果你对概率的对数感到满意,你可以走得更远。如果你感兴趣,我可以发布更多关于这一点的信息。

相关问题