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

lvc*_*lvc 15 python numpy scipy

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

phi*_*ler 12

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

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

在实践中,这种简单的算法对于计算很多特征向量不能很好地工作,因为任何舍入误差都会将更重要的特征向量的微小分量引入计算中,从而降低计算的准确性.(2)

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


Ale*_*exE 6

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

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

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