有没有办法提高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
i2byvkas1#
正如你所观察到的,你的例子中的CDF与64位浮点数的1.0没有区别。但是如果你想知道它有多接近1.0,你可以计算“生存函数”,它是CDF的补充。
1.0
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(“逆生存函数”):
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位浮点数可以直接表示的数字更小的数字,但是如果你对概率的对数感到满意,你可以走得更远。如果你感兴趣,我可以发布更多关于这一点的信息。
t
1条答案
按热度按时间i2byvkas1#
正如你所观察到的,你的例子中的CDF与64位浮点数的
1.0
没有区别。但是如果你想知道它有多接近1.0
,你可以计算“生存函数”,它是CDF的补充。字符串
代替
ppf
(cdf
的逆),你可以使用isf
(“逆生存函数”):型
如果不熟悉生存函数,使用分布关于原点对称的事实可能更方便。
型
对于正态分布,这将使你得到比37.5 sigma更远的结果(对于有限自由度的
t
,这将进一步)。在那之后,你正在处理比64位浮点数可以直接表示的数字更小的数字,但是如果你对概率的对数感到满意,你可以走得更远。如果你感兴趣,我可以发布更多关于这一点的信息。