scipy.linalg.eig左/右特征向量彼此不正交

时间:2018-02-13 09:05:52

标签: python numpy scipy

对于矩阵的特征分解,左和右特征向量应该彼此正交。使用scipy.linalg.eig我测试了将问题解决为标准特征值问题,也作为一般特征值问题。针对标准特征值问题返回的左/右特征向量彼此正交,通过计算它们的点积来验证。针对一般特征值问题返回的左/右特征向量彼此不正交。

要点:

左/右电子矢量不相互正交:

evals, evecs_l, evecs_r = scipy.linalg.eig(M, N, left=True, right=True)

左/右电子矢量彼此正交:

evals, evecs_l, evecs_r = scipy.linalg.eig(np.inverse.inv(N) @ M, left=True, right=True)

示例:

import numpy as np
import scipy.linalg

M = np.array([[1., 2.],
              [4., 5.]])

N = np.array([[0.2, 0.1],
              [0.7, 0.8]])


evals, evecs_l, evecs_r = scipy.linalg.eig(M,N,left=True,right=True)

np.set_printoptions(precision=3,linewidth=200)
print('inner product: GEP')
I = evecs_l.conj().T @ evecs_r
for i in range(I.shape[1]):
    print(I[i,:])


evals, evecs_l, evecs_r = scipy.linalg.eig(np.linalg.inv(N) @ M,left=True,right=True)

print('inner product: SEP')
I = evecs_l.conj().T @ evecs_r
np.set_printoptions(precision=3,linewidth=200)
for i in range(I.shape[1]):
    print(I[i,:])

返回:

inner product: GEP
[-0.153 -0.818]
[0.932 0.907]
inner product: SEP
[0.721 0.   ]
[0.    0.721]

所以,我想知道是否有人可以提供对这种行为的见解。我是否错误地解释了结果或预期的行为?

系统: Python 3.6.4,numpy 1.14.0,scipy 1.0.0,OS X 10.13.3

1 个答案:

答案 0 :(得分:1)

在常规特征值分解中,左右特征向量正交的陈述可以重新表示为乘积evecs_l.conj().T @ evecs_r是对角线。对于广义特征值问题Mx = λNx,该陈述一般不正确。在那里,它变成产品evecs_l.conj().T @ N @ evecs_r是对角线。 (我们需要写evecs_l.conj().T而不是evecs_l,因为scipy.linalg.eig会返回矩阵列中左特征向量的共轭。)

例如,

In [38]: M
Out[38]: 
array([[ 1.,  2.],
       [ 4.,  5.]])

In [39]: N
Out[39]: 
array([[ 0.2,  0.1],
       [ 0.7,  0.8]])

In [40]: evals, evecs_l, evecs_r = scipy.linalg.eig(M, N, left=True, right=True)
    ...: 

In [41]: np.set_printoptions(precision=3, linewidth=200, suppress=True)

In [42]: evecs_l.conj().T @ N @ evecs_r
Out[42]: 
array([[ 0.701, -0.   ],
       [ 0.   ,  0.08 ]])