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

2024-04-26 11:55:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. ^{}
  2. ^{},和
  3. ^{}

特别是在以下情况下,我在最后两个参数中省略的所有可选参数都保留为默认值,a/A是真正有价值的,我很好奇这三个参数之间的差异,这些差异在文档中是不明确的,特别是:

  • 为什么(3)有一个注释,它不能找到所有的特征向量?
  • 为什么必须另外两个计算所有解-为什么他们不接受一个k参数?
  • (1) 注意,特征值不按特定顺序返回;(3)有一个可选参数来控制顺序。(2)对此有什么保证吗?
  • (3)假设A是稀疏的吗?(从数学上讲,不是用稀疏矩阵来表示)如果这个假设不成立,它会不会效率低下,甚至给出错误的结果?
  • 在这些选择中,我还需要考虑其他因素吗?

Tags: 函数文档numpy参数顺序情况矩阵数学
2条回答

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

原则上,NumPy和SciPylinalg()例程应该相同。两者都在内部使用LAPACK和BLAS例程。“scipy.sparse”中的实现使用了一种特定的算法,该算法对稀疏矩阵(即大多数为零项的矩阵)非常有效。如果矩阵是稠密的,不要使用这个。

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

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

现在,Lanczos算法有一个特性,它可以更好地处理大特征值(实际上,它使用最大特征值):

In practice, this simple algorithm does not work very well for computing very many of the eigenvectors because any round-off error will tend to introduce slight components of the more significant eigenvectors back into the computation, degrading the accuracy of the computation. (2)

所以,虽然Lanczos算法只是一个近似值,但我猜其他两种方法使用算法来找到精确的特征值——而且看起来它们都是,这可能也取决于使用的算法。

相关问题 更多 >