Python特征向量:numpy.linalg,scipy.linalg和scipy.sparse.linalg之间的差异

时间:2012-06-18 13:12:31

标签: python numpy scipy

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

  1. numpy.linalg.eig(a)
  2. scipy.linalg.eig(a)
  3. scipy.sparse.linalg.eig(A, k)
  4. 特别关注我最后两个留下的所有可选参数都保留默认值且a / A是实值的情况,我很好奇这些差异这三个文档中含糊不清 - 特别是:

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

2 个答案:

答案 0 :(得分:12)

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

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

  

在实践中,这种简单的算法效果不佳   计算很多特征向量,因为任何舍入误差   将倾向于引入更重要的轻微组件   特征向量回到计算中,降低了精度   计算。 (2)

所以,虽然Lanczos算法只是一个近似值,但我猜其他两种方法使用algos来找到精确特征值 - 看起来所有这些都可能取决于所使用的算法,太

答案 1 :(得分:6)

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

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

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