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

4
使用scipy,我想计算广义特征值问题(请参阅此链接)。
在我的情况下,矩阵A是对称的和实数的,尽管不是正定的(据我所知它不需要是)。矩阵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))

3
我将此关闭并链接到与“为什么来自不同来源的特征向量不一致?”有关的问题,因为我的回答是完全相同的。两个不同实现的函数使用相同的归一化并不保证,这就是发生这种情况的原因。 - DSM
只有特征值和特征向量的方向(反射也可以)才是重要的。所以你得到的结果与其他人提到的结果相同。 - anishtain4
1个回答

2
eigh仅适用于对称矩阵,因此使用更快(且不同)的算法。这就是为什么它会产生不同的结果。对于任何给定的特征值,存在无限数量的特征向量,因此我认为您不需要担心。
我从未使用过这些方法,只是根据我的线性代数知识和在网上找到的关于eigheig的信息进行判断,请纠正我如果我错了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接