python - scipy.stats 中 cdf 的精度

标签 python numpy scipy precision cdf

我正在使用 chi2分布作为模拟系统的理论问题。

对于给定的区间,我需要将此分布估计为 PMF,定义为该区间内 PDF 的积分。该值应接近区间中心 PDF 的值,但可能略有不同,具体取决于 PDF 的形状。

这是我的做法:

import numpy
from scipy.stats import chi2

dist = chi2(10)
nbins = 120

F = dist.cdf(numpy.arange(nbins+1))
pmf = F[1:] - F[:-1] # surface inside the interval
pmf /= pmf.sum() # Normalisation

问题是 chi2.cdf(100, 10) 及以上给出的恰好是 1.0。所以我能得到的最小值大约是 1.11e-16。但是 chi2.pdf(100, 10) 不完全是 0(大约是 2.5e-17)。

我的问题是:如何更精确地估算 pmf(可能高达 1e-25)?为什么 cdf 函数不如 pdf 函数精确?

最佳答案

cdf 在等于 1 的浮点精度内,但 sf 接近于零,因此微小差异 1e-20 不会被大 1 掩盖。(参见 JABS 引用资料)

>>> probs_from_cdf = np.diff(stats.chi2.cdf(np.arange(nbins+1), 10))
>>> probs_from_sf = np.diff(stats.chi2.sf(np.arange(nbins+1)[::-1], 10))[::-1]
>>> probs_from_sf[:4]
array([ 0.00017212,  0.00348773,  0.01491609,  0.03407708])
>>> probs_from_cdf[:4]
array([ 0.00017212,  0.00348773,  0.01491609,  0.03407708])
>>> probs_from_cdf[-5:]
array([ 0.,  0.,  0.,  0.,  0.])
>>> probs_from_sf[-5:]
array([  1.94252577e-20,   1.21955220e-20,   7.65430774e-21,
         4.80270079e-21,   3.01259913e-21])

我不知道 sf 的准确范围,即 scipy.special.chdtrc(df, x) 有多远

关于python - scipy.stats 中 cdf 的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6298105/

相关文章:

Python:对多维数组进行切片

python - 在距离高度处从 SciPy 切割树状图/聚类树

python - 将大型不规则矩阵或表面数据点重新采样到规则网格进行插值

python - 在python中组织点数组

python - 列出按描述符类型过滤的对象属性

python - 也许 Python 中的 monad 带有方法链

python - Scipy 相当于 numpy where 对于稀疏矩阵

numpy - 如何对张量的最后两个维度进行矩阵乘法

python - 如何在 VIM 中折叠 python 源代码中的长文档字符串?

python - 使用 Python 的 Win32 ODBC 模块检索 Oracle 时间戳