SciPy 广义特征值:eig 和 eigh 产生不同的结果
SciPy generalized eigenvalues: eig and eigh yield different results
使用 scipy
,我想计算广义特征值问题(参见 this link)。
在我的例子中,matrix A
是对称且真实的,尽管不是正定的(它不需要是 afaik)。 Matrix B
是实数、对称且正定的。因此,scipy
算法 eig
和 eigh
都应该有效,我希望它们产生相同的结果。
但事实并非如此。
要重现,请考虑这些试验矩阵:
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))
eigh
仅适用于对称矩阵,因此使用更快(且不同)的算法。这就是为什么它会产生不同的结果。对于任何给定的特征值,都有无限多的特征向量,所以我认为您不必担心。
我从来没有使用过这些方法,只是根据我的线性代数知识和我在网上发现的关于 eigh
和 eig
的知识,所以如果我错了请纠正我。
使用 scipy
,我想计算广义特征值问题(参见 this link)。
在我的例子中,matrix A
是对称且真实的,尽管不是正定的(它不需要是 afaik)。 Matrix B
是实数、对称且正定的。因此,scipy
算法 eig
和 eigh
都应该有效,我希望它们产生相同的结果。
但事实并非如此。 要重现,请考虑这些试验矩阵:
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))
eigh
仅适用于对称矩阵,因此使用更快(且不同)的算法。这就是为什么它会产生不同的结果。对于任何给定的特征值,都有无限多的特征向量,所以我认为您不必担心。
我从来没有使用过这些方法,只是根据我的线性代数知识和我在网上发现的关于 eigh
和 eig
的知识,所以如果我错了请纠正我。