NumPy 中谱分解的符号差异

计算科学 线性代数 Python 本征系统 麻木的 谱法
2021-11-28 03:17:43

我试图从书中理解一个例子,但根据我在 NumPy 中使用的谱分解函数,我似乎得到了不同的答案。

我正在尝试找到谱分解WVW给定对称矩阵的G使用 NumPy 函数eigeigh,后者用于对称矩阵(其中G是):

  • eig返回以与书中答案不同的顺序排列的列。

  • eigh返回与书中相似的矩阵,但列中的符号不​​同24.

这些矩阵是等价的吗?它们在下游使用中产生不同的结果。任何帮助表示赞赏。

G = np.array([[-0.55,  0.3  , 0.   , 0.    ,0.25],
              [ 0.3 , -0.95 , 0.   , 0.4   ,0.25],
              [ 0.  ,  0.   ,-0.55 , 0.3   ,0.25],
              [ 0.  ,  0.4  , 0.3  ,-0.95  ,0.25],
              [ 0.25,  0.25 , 0.25 , 0.25  ,-1.  ]])

v1,w1 = np.linalg.eigh(G)
v2,w2 = np.linalg.eig(G)

print w1
array([[ 0.224,  0.224,  0.5  , -0.671,  0.447],
       [-0.671,  0.224, -0.5  , -0.224,  0.447],
       [-0.224,  0.224,  0.5  ,  0.671,  0.447],
       [ 0.671,  0.224, -0.5  ,  0.224,  0.447],
       [ 0.   , -0.894, -0.   ,  0.   ,  0.447]]))

print w2
array([[-0.447, -0.671, -0.5  ,  0.224, -0.224],
       [-0.447, -0.224,  0.5  , -0.671, -0.224],
       [-0.447,  0.671, -0.5  , -0.224, -0.224],
       [-0.447,  0.224,  0.5  ,  0.671, -0.224],
       [-0.447,  0.   ,  0.   ,  0.   ,  0.894]]))

"Answer in book"
array([[ 0.224, -0.224,  0.5  ,  0.671,  0.447],
       [-0.671, -0.224, -0.5  ,  0.224,  0.447],
       [-0.224, -0.224,  0.5  , -0.671,  0.447],
       [ 0.671, -0.224, -0.5  , -0.224,  0.447],
       [ 0.   ,  0.894, -0.   ,  0.   ,  0.447]]))
1个回答

wk是 W 的第 k 列(第 k 个特征向量)和vk是 v 的第 k 个元素(第 k 个特征值)。然后我们可以写:

G=kwkvkwkT
就元素而言,这相当于:
Gi,j=kvkwi,kwj,k
其中索引是列主要的。因为我们总是得到wk两次,一列上的整体标志W取消。由于总和超过k可以以任何顺序出现,列的顺序W也无所谓,只要元素v顺序相同。

如果它们在下游产生不同的结果,您可能会遇到错误。你与使用v1withw1v2with一致w2吗? v1并且v2应该具有相同的元素但顺序不同。既不eig也不eigh保证特征值的排序。