微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决R 与 Python 在浮点分辨率方面的差异:是否可以将 Python 设置为像 R 一样?

我正在从事一个涉及线性代数概念处理的个人项目。 该项目首先涉及将 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) 还是我完全错了?在这种情况下,您有任何潜在客户吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。