【问题标题】:Precision of numpy's eigenvalueshnumpy特征值的精度
【发布时间】:2012-12-15 09:58:28
【问题描述】:

首先,我使用numpy.linalg.eigvalsh 找到 (4000x4000) 矩阵的特征值。然后,我改变了边界条件,期望特征值只有微小的变化。

减去特征值容易受到浮点错误的影响,因此我使用了一些相对容差。

现在假设我有一个特征值 A = 1.0001e-10 和另一个 B = 1.0050e-10。根据我对浮点运算的浅薄知识,A - B != 0。问题是,这些数字来自涉及多个数量级的线性代数计算。例如,其他特征值可能是1

问题是,使用numpy.linalg.eigvalsh 计算的特征值的精度是多少?这个精度是相对于值 (A * eps),还是相对于最大特征值?还是相对于原始矩阵的元素?

例如这个矩阵:

1      1e-20
1e-20  3

给出与此相同的特征值:

1     1e-5
1e-5  3

【问题讨论】:

    标签: python numpy floating-point linear-algebra


    【解决方案1】:

    我不确定是否在 eigvalsh 下使用了 Lapack,但这可能很有趣:

    对称/非对称特征问题的 Lapack 误差界限:

    http://www.netlib.org/lapack/lug/node89.html

    http://www.netlib.org/lapack/lug/node91.html

    【讨论】:

    • 谢谢@aka.nice,这似乎是正确的方向。我是否正确理解精度就像 epsilon 乘以最大特征值?
    • 是的,在对称情况下,这也是我所理解的。
    • 让我补充一点,通常在秩计算中,小于 N 乘以 epsilon 乘以最大特征值的特征值被认为等于 0。 (所有计算量级)。
    【解决方案2】:

    首先,求解器并不精确。其次,您的示例矩阵条件不佳:对角线元素比非对角线元素大几个数量级。这总是会导致数字问题。

    根据简单代数,第二个矩阵的行列式是(1 * 3) - (1e5 * 1e5) = 3 - 1e-10。您已经可以看到精度问题实际上是最小元素精度的两倍。 (这同样适用于特征值。)即使 linalg 使用双精度,因为求解器是近似的,所以你会得到相同的答案。如果您将较小的值更改为 1e-3,您会开始看到差异,因为现在精度是数值近似的数量级。

    这个具体问题has been asked before。您可以在this answer 中看到如何使用 sympy 以任意精度求解特征值。

    【讨论】:

    • 谢谢@tiago。这些矩阵只是例子,夸大了手头的问题,而不是我实际使用的。问题不在于为什么结果不同,或者如何解决这个问题。问题是特征值结果的有效性机制是什么,因为我想比较两个有细微差别的集合。你的回答完全不同。
    • @jarondl,再看一遍,我确实错过了你问题的最后一段……我以为你更喜欢任意精度线性代数。
    猜你喜欢
    • 1970-01-01
    • 2016-02-22
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多