【问题标题】:SciPy generalized eigenvalues: eig and eigh yield different results [duplicate]SciPy 广义特征值:eig 和 eigh 产生不同的结果
【发布时间】:2019-01-15 23:30:59
【问题描述】:

使用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))

【问题讨论】:

  • 我已经关闭了这个作为相关“为什么这些来自不同来源的特征向量不同意?”的欺骗。问题,因为我的答案将完全相同。不能保证两个单独实现的函数会使用相同的规范化,这就是这里发生的事情。
  • 重要的是特征值和特征向量的方向(也允许反射)。所以你得到的结果和其他人提到的一样。

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


【解决方案1】:

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

我从来没有使用过这些方法,我只是脱离了我的线性代数知识以及我在网上发现的关于eigh 和eig 的内容,所以如果我错了,请纠正我。

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 2021-09-03
    • 2016-08-17
    • 2023-03-21
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多