R 与 Python 在浮点分辨率上的差异:是否可以将 Python 设置为像 R 一样?

R vs Python differences in floating point resolution : Is it possible to set Python act like R?

提问人:ce.teuf 提问时间:4/23/2021 最后编辑:ce.teuf 更新时间:4/24/2021 访问量:474

问:

我正在从事一个涉及线性代数概念操作的个人项目。 该项目首先涉及将 R(64 位版本)代码复制(翻译)为 Python 代码。 此处描述的问题试图重现我面临的问题。

根据我所做的一些互联网搜索,这个问题似乎与非常精确地处理十进制数有关。

下面是两段代码:

R代码:

library(base)

# load, subsetting and convert df to matrix
df <- read.csv('hansen99.csv') 
arr <- data.matrix(df[c(4:20)])

# crossprod leads to a square matrix and do inverse calculation
A <- t(arr) %*% arr # crossprod leads to a square matrix
A_inv <- solve(A)   

# affichage avec 100 décimales
sprintf("%.100f",A_inv[1,1]) 
# '0.0023559636604639148764472889041599046322517096996307373046875000000000000000000000000000000000000000'

Python 代码:

import numpy as np
import numpy.linalg as npla
import pandas as pd

# load, subsetting and convert df to array
df = pd.read_csv('hansen99.csv')
arr = df.iloc[:, 3:21].values

# crossprod leads to a square matrix and do inverse calculation
A = np.transpose(arr) @ arr
A_inv = npla.inv(A)

# affichage avec 100 décimales
"{:.100f}".format(A_inv[0,0])
# '0.0023559636604639157438090268925634518382139503955841064453125000000000000000000000000000000000000000'

因此,A_inv 是给定矩阵 A(csv 文件)的倒数。如果我取这个矩阵的第一个元素并用 100 位小数打印它,我得到:

R      : '0.0023559636604639*1*48764472889041599046322517096996307373046875000000000000000000000000000000000000000'

Python : '0.0023559636604639*1*57438090268925634518382139503955841064453125000000000000000000000000000000000000000'

我们可以看到,在小数点后第 17 位(星号之间)之后,R 和 Python 之间显示的数字序列是不同的。

我做了一些研究,这似乎与类型的十进制分辨率有关。

在 python 中,我有 float64 类型的命令(不知道如何在 R 中获取它):

np.finfo(np.float64)
# finfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)

注意

这种差异似乎与两种语言各自功能之间的差异无关。我调用了 Python 中的 R 函数和 R 中的 Python 函数来确保。

数据

如果您对数据感兴趣,请关注 https://github.com/ceteuf/PSTR/tree/main/data/hansen99.csv

问题

1)您认为造成这种差异的原因是什么?(需要澄清,并可能提供良好的资源以了解更多信息)

2) 是否有可能通过修改配置或其他方式来重现与 R 完全相同的结果和行为?

2b) 还是我完全错了?在这种情况下,你有线索吗?

Python R 线性代数 点浮点精度

评论

0赞 r2evans 4/23/2021
在 R 中,可以在 中找到分辨率/精度信息。机器
0赞 ce.teuf 4/23/2021
您好,我知道这种方法,但我看不到与 Python 中等效的解析项。
1赞 Onyambu 4/24/2021
.Machine$double.xmax?
1赞 ce.teuf 4/24/2021
@r2evans我已经编辑了误导性的“未找到 R”
3赞 John Coleman 4/24/2021
它们都应该使用 64 位 IEEE 浮点数。不管问题是什么,我怀疑这是否是一个精确的问题。它可能只是展示之一。如果不在 Python 中使用该模块,类似的东西就毫无意义。IEEE 浮点数在 R 或 Python 中都没有那么高的精度。decimal"%.100f"

答: 暂无答案