24

Scipy 和 Numpy 在它们之间有三个不同的函数来查找给定方阵的特征向量,它们是:

  1. numpy.linalg.eig(a)
  2. scipy.linalg.eig(a), 和
  3. scipy.sparse.linalg.eig(A, k)

特别关注我离开最后两个的所有可选参数都保留默认值并且a/A是实值的情况,我很好奇这三个在文档中模棱两可的差异 - 特别是:

  • 为什么(3)有一个说明它无法找到所有特征向量?
  • 为什么其他两个必须计算所有解决方案——他们为什么不k争论呢?
  • (1) 有一个注释说特征值没有特定的顺序返回;(3) 有一个可选参数来控制顺序。(2) 是否对此作出任何保证?
  • (3) 是否假设它A是稀疏的?(从数学上讲,而不是表示为 scipy 稀疏矩阵)如果这个假设不成立,它会效率低下,甚至给出错误的结果吗?
  • 在这些中进行选择时,我还应该考虑其他因素吗?
4

2 回答 2

12

第三个的特殊行为与Lanczos 算法有关,该算法非常适用于稀疏矩阵。的文档scipy.sparse.linalg.eig说它使用了 ARPACK 的包装器,而 ARPACK 又使用“隐式重启 Arnoldi 方法 (IRAM),或者在对称矩阵的情况下,使用 Lanczos 算法的相应变体”。(1)

现在,Lanczos 算法具有对大特征值效果更好的特性(实际上,它使用最大特征值):

在实践中,这种简单的算法在计算大量特征向量时效果不佳,因为任何舍入误差都会将更重要的特征向量的微小分量引入计算中,从而降低计算的准确性。(2)

因此,虽然 Lanczos 算法只是一个近似值,但我猜其他两种方法使用算法来找到确切的特征值——而且似乎所有这些方法都可能取决于所使用的算法。

于 2012-06-18T13:43:20.037 回答
8

这是您问题的非常规特定部分的答案:

原则上,NumPy 和 SciPylinalg()例程应该是相同的。两者都在内部使用 LAPACK 和 BLAS 例程。中的实现scipy.sparse使用了一种适用于稀疏矩阵的特定算法(即,大多数条目为零的矩阵)。如果您的矩阵很密集,请不要使用它。

请注意,从技术上讲,eig()SciPy/NumPy 中的实现是不同的,因为这两个包都可以使用不同的 Lapack/BLAS 实现来构建。这里的常见选择是标准 Lapack/BLAS,可从 netlib、ATLAS、Intel MKL 或OpenBLAS 获得

于 2012-06-18T13:58:33.553 回答