Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
numpy.var中的精度错误_Numpy_Numerical Methods_Floating Point Precision_Variance - Fatal编程技术网

numpy.var中的精度错误

numpy.var中的精度错误,numpy,numerical-methods,floating-point-precision,variance,Numpy,Numerical Methods,Floating Point Precision,Variance,我正在尝试以下代码来估计样本中的方差,并将其与numpy.var实现进行比较 import numpy as np def rcov(xj, (i, Mi, Si)): j = i + 1 Mj = Mi + (xj - Mi) / j Sj = Si + (i/j) * (xj - Mi) ** 2 return (j, Mj, Sj) def mycov(X): s = (0., 0, 0)

我正在尝试以下代码来估计样本中的方差,并将其与numpy.var实现进行比较

import numpy as np

def rcov(xj, (i, Mi, Si)):
        j  = i + 1
        Mj = Mi + (xj - Mi) / j
        Sj = Si + (i/j) * (xj - Mi) ** 2
        return (j, Mj, Sj)

def mycov(X):
        s = (0., 0, 0)
        for i in xrange(len(X)):
                s = rcov(X[i], s)
        return s[-1] / (len(X) - 1) # sample covariance

X = np.random.rand(1000000)
N = 1e+15

print
print 'Sample (co)variance with 1 dof.'
print '-------------------------------'
print 'np.var(X)     ', np.var(X, ddof=1)
print 'mycov(X)      ', mycov(X)
print 'np.var(X+N)   ', np.var(X+N, ddof=1)
print 'mycov(X+N)    ', mycov(X+N)
输出是

Sample (co)variance with 1 dof.
-------------------------------
np.var(X)      0.0833039106062
mycov(X)       0.0833039106062
np.var(X+N)    19208514.2744
mycov(X+N)     0.0859324294763
提出两个问题:

  • 如果我升级到numpy 1.8会有帮助吗?我现在在1.6.1上
  • numpy是一个数字库。为什么它在一个简单的数值问题上失败了

  • 为了提高速度,NumPy不会检查算术溢出或下溢。用户有责任选择足够大的数据类型,以便在所有计算过程中保持所需的精度水平

    使用NumPy 1.8,并选择
    X
    作为数据类型
    longdouble
    ,而不是默认的
    float64

    X = np.random.rand(1000000).astype('longdouble')
    
    屈服

    Sample (co)variance with 1 dof.
    -------------------------------
    np.var(X)      0.0832200737104
    mycov(X)       0.0832200737104
    np.var(X+N)    0.0832200805148
    mycov(X+N)     0.0832199500372
    

    numpy 1.9为1d数组实现了更精确的求和,从而将结果提高了一点(我得到了0.22),但它目前没有为方差实现一个数字稳健的算法。最好使用名称
    np.longdouble
    float96
    仅在长双精度为12字节的系统上可用。在大多数64位系统上,它的长度为16字节,因此命名为
    float128
    。在任何情况下,精度仅为80位(如果平台提供此功能)。目前没有真正的IEEE quads的numpy支持。谢谢。我可以这样做。虽然很难看出numpy内部需要多少精度(据我所知,这个错误是特定于它们的实现的)。