【问题标题】:Python eigenvectors: differences among numpy.linalg, scipy.linalg and scipy.sparse.linalgPython特征向量:numpy.linalg、scipy.linalg和scipy.sparse.linalg之间的区别
【发布时间】:2012-06-18 13:12:30
【问题描述】:

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 稀疏矩阵)如果这个假设不成立,它会效率低下,甚至给出错误的结果吗?
  • 在这些因素中进行选择时我还应该考虑其他因素吗?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

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

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

    在实践中,这个简单的算法并不适用于 计算很多特征向量,因为任何舍入误差 将倾向于引入更显着的轻微成分 特征向量回到计算中,降低了计算的准确性 计算。 (2)

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

    【讨论】:

      【解决方案2】:

      以下是您问题中非常规特定部分的答案:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        • 2017-09-25
        • 2014-05-11
        • 2011-01-01
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        相关资源
        最近更新 更多