我试图确定矩阵是否为负半定义。因此,我检查所有特征值是否小于或等于零。一个示例矩阵是:
[,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获得的特征值是半定义的。有没有办法可以找出哪种计算更准确?或者甚至可以重新缩放矩阵以避免无限小的特征值?
非常感谢您提前。每一个提示都将受到高度赞赏。
答案 0 :(得分:2)
使用双精度浮点数的数值算法无法预期如此精确。
您可以预期不超过17个十进制数字,并且零附近的相对精度损失并不罕见。也就是说,给定数值误差,1e-12和-1e-20都与0无法区分。
例如,对于最小的特征值(使用您在评论中给出的系数),我得到:
你可以选择一个阈值,比如1e-10,当它与最大特征值的比率小于1e-10时,强制特征值为零。
无论如何,你的1e-12看起来有点大。在Stata和R之间传输数据时,您可能已经失去了一些精度:矩阵中的小相对误差可能导致特征值的大相对误差为零。 对于Stata和你问题中的数据(不在评论中),我得到了最小特征值的3.696e-12。
然而,即使使用相同的矩阵,由于以下方面的变化,仍可能存在差异(上文中有):
传统建议阅读这类问题:
What Every Computer Scientist Should Know About Floating-Point Arithmetic