numpy.var中的精度错误
我正在尝试以下代码来估计样本中的方差,并将其与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)
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不会检查算术溢出或下溢。用户有责任选择足够大的数据类型,以便在所有计算过程中保持所需的精度水平 使用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内部需要多少精度(据我所知,这个错误是特定于它们的实现的)。