矩阵计算精度 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