Scipy 和 Numpy 具有三个不同的函数来查找给定方阵的特征向量,它们是:
- numpy.linalg.eig(a) http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html#numpy.linalg.eig
-
scipy.linalg.eig(a) http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.eig.html#scipy.linalg.eig, and
- scipy.sparse.linalg.eig(A, k) http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.eigs.html#scipy.sparse.linalg.eigs
特别关注我在最后两个中留下的所有可选参数都保留默认值的情况a
/A
是实值,我很好奇这三个之间的差异,这些差异在文档中是不明确的 - 特别是:
- 为什么(3)有一个注释找不到all特征向量?
- Why must另外两个计算所有解决方案 - 为什么他们不采取
k
争论?
- (1) 有注释说特征值不按特定顺序返回; (3) 有一个可选参数来控制顺序。 (2)对此有任何保证吗?
- (3) 是否假设
A
稀疏吗? (从数学上来说,而不是表示为 scipy 稀疏矩阵)如果这个假设不成立,它会效率低下,甚至给出错误的结果吗?
- 在这些因素中进行选择时我还应该考虑其他因素吗?
第三个的特殊行为与兰佐斯算法 http://en.wikipedia.org/wiki/Lanczos_algorithm,这对于稀疏矩阵非常有效。的文档scipy.sparse.linalg.eig
说它使用 ARPACK 的包装器,而 ARPACK 又使用“隐式重新启动 Arnoldi 方法 (IRAM),或者在对称矩阵的情况下,使用 Lanczos 算法的相应变体”。(1) http://en.wikipedia.org/wiki/ARPACK.
现在,Lanczos 算法具有对于大特征值更有效的特性(事实上,它使用最大特征值):
在实践中,这个简单的算法对于以下情况并不能很好地工作:
计算非常多的特征向量,因为任何舍入误差
往往会引入更重要的微小成分
特征向量回到计算中,降低了计算的准确性
计算。(2) http://en.wikipedia.org/wiki/Lanczos_algorithm
因此,虽然 Lanczos 算法只是一个近似值,但我猜其他两种方法使用 algos 来找到exact特征值——似乎所有特征值,这可能也取决于所使用的算法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)