SciPy广义特征值:eig和eigh产生不同的结果

时间:2018-08-08 16:02:22

标签: python numpy scipy linear-algebra matrix-decomposition

我想使用scipy计算一个广义特征值问题(请参阅this link)。

在我的情况下,matrix A是对称且实数的,尽管不是正定的(它不一定是afaik)。 Matrix B是实的,对称的和正定的。因此,scipy算法eigeigh都应该起作用,我希望它们能产生相同的结果。

但事实并非如此。 要进行复制,请考虑以下试验矩阵:

A = [[-0.19031723,-0.40125581],[-0.40125581,-0.19031723]]
B = [[1.0,0.38703254],[0.38703254,1.0]]

>>> scipy.linalg.eig(A,B)
# Eigenvalues:
[-0.42650264+0.j,  0.34412688+0.j]
# Eigenvectors:
[[-0.70710678, -0.70710678],[-0.70710678,  0.70710678]]

>>> scipy.linalg.eigh(A,B)
# Eigenvalues:
[-0.42650264,  0.34412688]
# Eigenvectors:
[[-0.60040137,  0.90316332],[-0.60040137, -0.90316332]]

这不仅发生在我的计算机上,而且可以在不同的计算机上重现。

我很困惑,为什么两种算法中的特征向量都不相同?我需要担心吗?


要复制的代码(例如,在https://www.katacoda.com/courses/python/playground上):

import scipy.linalg as la
A = [[-0.19031723,-0.40125581],[-0.40125581,-0.19031723]]
B = [[1.0,0.38703254],[0.38703254,1.0]]

print("Result of scipy.linalg.eig(A,B)")
print(la.eig(A,B))
print("------------------")
print("Result of scipy.linalg.eigh(A,B)")
print(la.eigh(A,B))

1 个答案:

答案 0 :(得分:1)

eigh仅用于对称矩阵,因此使用更快(且不同)的算法。这就是为什么它产生不同结果的原因。对于任何给定的特征值,特征向量的数量都是无限的,所以我认为您不必担心。

我从没使用过这些方法,只是从线性代数知识和在线eigheig的发现中脱颖而出,所以如果我错了,请纠正我。