矩阵计算精度 R vs. Stata
Precision of matrix calculation R vs. Stata
我正在尝试确定矩阵是否为负半定矩阵。出于这个原因,我检查所有特征值是否小于或等于零。一个示例矩阵是:
[,1] [,2] [,3] [,4]
[1,] -1.181830e-05 0.0001576663 -2.602332e-07 1.472770e-05
[2,] 1.576663e-04 -0.0116220027 3.249607e-04 -2.348050e-04
[3,] -2.602332e-07 0.0003249607 -2.616447e-05 3.492998e-05
[4,] 1.472770e-05 -0.0002348050 3.492998e-05 -9.103073e-05
stata计算出的特征值为1.045e-12,-0.00001559,-0.00009737,-0.01163805。然而,R计算出的特征值为-1.207746e-20、-1.558760e-05、-9.737074e-05、-1.163806e-02。所以最后三个特征值非常相似,但第一个非常接近于零的特征值却不同。使用stata获得的特征值,矩阵不是半定义的,但是使用R获得的特征值是半定义的。有没有办法找出哪种计算更精确?或者甚至可以重新缩放矩阵以避免特征值无限小?
非常感谢您。我们将不胜感激每一个提示。
您不能指望使用双精度浮点数的数值算法有如此高的精度。
十进制数不超过 17 位,零附近的相对精度损失并不少见。也就是说,给定数值误差,1e-12 和 -1e-20 与 0 几乎没有区别。
例如,对于最小的特征值(使用您在评论中给出的系数),我得到:
- R 3.4.1: 5.929231e-21,
- MATLAB R2017a: 3.412972022812169e-19
- Stata 15: 3.2998e-20 (matrix eigenvalues) or 4.464e-19 (matrix symeigen)
- 带有 MKL 的英特尔 Fortran(DSYEV 函数):2.2608e-19
您可以选择一个阈值,例如 1e-10,并在其与最大特征值的比率小于 1e-10 时将特征值强制为零。
总之,你的1e-12看起来有点大。在 Stata 和 R 之间传输数据时,您可能会失去一些精度:矩阵中较小的相对误差会导致特征值接近零的较大相对误差。
使用 Stata 和您问题中的数据(不在评论中),我得到例如 3.696e-12 最小特征值。
然而,即使使用相同的矩阵,由于以下方面的变化,仍然可能存在差异(上面有):
- 解析器,如果您将数字作为文本输入
- 用于特征值计算的算法
- 同一算法的实现细节(例如,浮点运算符不是关联的)
- 用于编译计算例程的编译器,或编译器选项
- 浮点硬件
此类问题的传统建议阅读:
What Every Computer Scientist Should Know About Floating-Point Arithmetic
我正在尝试确定矩阵是否为负半定矩阵。出于这个原因,我检查所有特征值是否小于或等于零。一个示例矩阵是:
[,1] [,2] [,3] [,4]
[1,] -1.181830e-05 0.0001576663 -2.602332e-07 1.472770e-05
[2,] 1.576663e-04 -0.0116220027 3.249607e-04 -2.348050e-04
[3,] -2.602332e-07 0.0003249607 -2.616447e-05 3.492998e-05
[4,] 1.472770e-05 -0.0002348050 3.492998e-05 -9.103073e-05
stata计算出的特征值为1.045e-12,-0.00001559,-0.00009737,-0.01163805。然而,R计算出的特征值为-1.207746e-20、-1.558760e-05、-9.737074e-05、-1.163806e-02。所以最后三个特征值非常相似,但第一个非常接近于零的特征值却不同。使用stata获得的特征值,矩阵不是半定义的,但是使用R获得的特征值是半定义的。有没有办法找出哪种计算更精确?或者甚至可以重新缩放矩阵以避免特征值无限小?
非常感谢您。我们将不胜感激每一个提示。
您不能指望使用双精度浮点数的数值算法有如此高的精度。
十进制数不超过 17 位,零附近的相对精度损失并不少见。也就是说,给定数值误差,1e-12 和 -1e-20 与 0 几乎没有区别。
例如,对于最小的特征值(使用您在评论中给出的系数),我得到:
- R 3.4.1: 5.929231e-21,
- MATLAB R2017a: 3.412972022812169e-19
- Stata 15: 3.2998e-20 (matrix eigenvalues) or 4.464e-19 (matrix symeigen)
- 带有 MKL 的英特尔 Fortran(DSYEV 函数):2.2608e-19
您可以选择一个阈值,例如 1e-10,并在其与最大特征值的比率小于 1e-10 时将特征值强制为零。
总之,你的1e-12看起来有点大。在 Stata 和 R 之间传输数据时,您可能会失去一些精度:矩阵中较小的相对误差会导致特征值接近零的较大相对误差。 使用 Stata 和您问题中的数据(不在评论中),我得到例如 3.696e-12 最小特征值。
然而,即使使用相同的矩阵,由于以下方面的变化,仍然可能存在差异(上面有):
- 解析器,如果您将数字作为文本输入
- 用于特征值计算的算法
- 同一算法的实现细节(例如,浮点运算符不是关联的)
- 用于编译计算例程的编译器,或编译器选项
- 浮点硬件
此类问题的传统建议阅读:
What Every Computer Scientist Should Know About Floating-Point Arithmetic