【发布时间】:2016-04-15 01:15:31
【问题描述】:
我正在使用 Python (Numpy) 和 R 进行数据分析。我的数据是一个向量 795067 X 3,根据我使用的是 Numpy 还是 R,计算该数据的平均值、中位数、标准差和 IQR 会产生不同的结果. 我交叉检查了这些值,看起来 R 给出了“正确”的值。
Median:
Numpy:14.948499999999999
R: 14.9632
Mean:
Numpy: 13.097945407088607
R: 13.10936
Standard Deviation:
Numpy: 7.3927612774052083
R: 7.390328
IQR:
Numpy:12.358700000000002
R: 12.3468
两个平台上数据的最大值和最小值相同。我进行了快速测试以更好地了解这里发生了什么。
- 在 Numpy 中乘以 1.2*1.2 得到 1.4(与 R 相同)。
- 在 Numpy 中乘以 1.22*1.22 得到 1.4884,在 R 中也是如此。
- 但是,在 Numpy 中乘以 1.222*1.222 得到 1.4932839999999998,这显然是错误的!在 R 中做乘法给出 1.49324 的正确答案。
- 在 Numpy 中乘以 1.2222*1.2222 在 R 中得到 1.4937728399999999 和 1.493773。再一次,R 是正确的。
在 Numpy 中,数字是 float64 数据类型,在 R 中它们是双精度数。这是怎么回事?为什么 Numpy 和 R 给出不同的结果?我知道 R 使用 IEEE754 双精度,但我不知道 Numpy 使用什么精度。我怎样才能改变 Numpy 给我“正确”的答案?
【问题讨论】:
-
这将有助于显示您的代码,以便我们解决您的实际问题。区分浮点是如何打印与实际浮点值也很重要。例如,在 R 中,
sprintf("%.20f", 1.222*1.222)打印出"1.49328399999999983372",这与您在 Python 中得到的'{:.20f}'.format(1.222*1.222)完全相同。浮点值是一样的,但是当你在 R 提示符下输入1.222*1.222时,R 打印1.493284而 Python 打印1.4932839999999998 -
您也可以尝试将 NumPy 数据的
dtype更改为float128:data = data.astype(np.float128)。这可能会有所帮助,尽管这只是在没有看到您的 Python 和 R 代码的情况下在黑暗中拍摄。 -
@unutbu:R 使用 64 位浮点数,因此在 Python 中坚持使用 64 位浮点数在这里是合理的。
-
尝试将您的数据集缩减为仍然显示出差异的较小数据集。发布你的代码,如果可能的话,减少数据集(如果它很大,你不能在这里粘贴它,所以在别处分享)。
-
“在 Numpy 中乘以 1.2*1.2 得到 1.4” - 这不是乘法的工作原理!
标签: python r numpy precision ieee-754