Scipy和Numpy在它们之间有三个不同的函数来寻找给定方阵的特征向量,它们是:
numpy.linalg.eig(a)
scipy.linalg.eig(a)
和scipy.sparse.linalg.eig(A, k)
特别关注我最后两个留下的所有可选参数都保留默认值且a
/ A
是实值的情况,我很好奇这些差异这三个文档中含糊不清 - 特别是:
k
参数?A
稀疏? (从数学上讲,不是被表示为scipy稀疏矩阵)如果这个假设不成立,它可能效率低下,甚至给出错误的结果吗?答案 0 :(得分:12)
第三个特殊行为与Lanczos algorithm有关,它与稀疏矩阵一起使用效果很好。 scipy.sparse.linalg.eig
的文档说它使用ARPACK的包装器,后者又使用“隐式重启的Arnoldi方法(IRAM),或者在对称矩阵的情况下,使用Lanczos算法的相应变体。” (1)
现在,Lanczos算法具有对大特征值更有效的特性(事实上,它使用最大特征值):
在实践中,这种简单的算法效果不佳 计算很多特征向量,因为任何舍入误差 将倾向于引入更重要的轻微组件 特征向量回到计算中,降低了精度 计算。 (2)
所以,虽然Lanczos算法只是一个近似值,但我猜其他两种方法使用algos来找到精确特征值 - 看起来所有这些都可能取决于所使用的算法,太
答案 1 :(得分:6)