对于矩阵的特征分解,左和右特征向量应该彼此正交。使用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
答案 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 ]])