Numpy scipy.linalg.eig是否给出了正确的左特征向量?

Numpy scipy.linalg.eig是否给出了正确的左特征向量?,numpy,scipy,eigenvector,Numpy,Scipy,Eigenvector,我有一个关于scipy.linalg.eig如何计算左右特征向量的问题。也许我误解了一切,但事情似乎不对劲 从一开始。为了得到特征值和两个特征向量,我使用了以下方法: ev,left\u v,right\u v=scipy.linalg.eig(A,left=True) 根据,在调用函数时设置left=True后,我应该期望得到左特征向量作为left_v的列,其中第I列指第I个特征值。然而,结果不是我预期的,所以我做了一个简单的检查 我计算了两次调用函数的右特征向量和左特征向量(查看详细信息):

我有一个关于scipy.linalg.eig如何计算左右特征向量的问题。也许我误解了一切,但事情似乎不对劲

从一开始。为了得到特征值和两个特征向量,我使用了以下方法:

ev,left\u v,right\u v=scipy.linalg.eig(A,left=True)

根据,在调用函数时设置
left=True
后,我应该期望得到左特征向量作为
left_v
的列,其中第I列指第I个特征值。然而,结果不是我预期的,所以我做了一个简单的检查

我计算了两次调用函数的右特征向量和左特征向量(查看详细信息):

其中,
left_v_2
列是与
left_ev
中的相应值相关联的特征向量。 值得强调的是,
right_ev_2
left_ev_2
都给出了相同的特征值,但它们的顺序不同,需要加以考虑

比较
left_ev
left_ev_2
(根据特征值重新排序后),可以很快发现前者是后者的共轭,因此从
scipy.linalg.eig
获得的
left_ev
不是有效的左特征向量

可以根据以下事实对特征向量的有效性进行另一次检查:对于任意实平方矩阵,左特征向量和右特征向量是双正交的,即:

left_v.T.dot(right_v)
应该给出一个对角矩阵,但它没有, 直到我将其更改为:
left_v.T.conj().dot(right_v)

而:

left_v_2.T.dot(right_v_2)
给出了预期的对角矩阵

以前有没有人遇到过类似的问题?我说的对吗?sciPy手册在描述eig时是否有点不精确?你能给我一些建议吗


非常感谢

关于
vl
eig
文档字符串说:

a.H vl[:,i] = w[i].conj() b.H vl[:,i]
或者,取两边的共轭转置(即厄米转置)(即.H的意思),并假设
b
是恒等式

vl[:,i].H a = w[i] vl[:,i].H
因此,
vl
的共轭转置行是
a
的实际左特征向量

Numpy数组实际上没有.H属性,因此必须使用.conj().t

以下是验证计算的脚本:

将numpy导入为np
从scipy.linalg导入eig
#这只会影响打印输出。
np.设置打印选项(精度=4)
a=np.array([[6,2],
[-1, 4]])
w、 vl,vr=eig(a,左=真)
打印“特征值:”,w
打印
#逐个检查左特征向量:
对于范围内的k(a.形状[0]):
val=w[k]
#使用切片来保持形状;vec是一个2x1阵列。
#这允许使用.T进行有意义的转置。
vec=vl[:,k:k+1]
#rowvec为1x2;它是vec的共轭转置。
#这应该是左特征向量。
rowvec=vec.conj().T
#验证rowvec是否为左特征向量
lhs=行向量点(a)
rhs=val*rowvec
打印“比较”,左侧,“至”,右侧
打印rowvec,“是”,
如果不是np.ALLCOSE(左、右):
打印“*非*”,
打印“特征值的左特征向量”,val
打印
打印“矩阵版本:”
打印“这个”
打印vl.conj().T.dot(a)
打印“应等于此”
打印np.diag(w).dot(vl.conj().T)
输出:

eigenvalues: [ 5.+1.j  5.-1.j]

Compare [[ 1.6330+2.4495j  4.0825+0.8165j]] to [[ 1.6330+2.4495j  4.0825+0.8165j]]
[[ 0.4082+0.4082j  0.8165-0.j    ]] is a left eigenvector for eigenvalue (5+1j)
Compare [[ 1.6330-2.4495j  4.0825-0.8165j]] to [[ 1.6330-2.4495j  4.0825-0.8165j]]
[[ 0.4082-0.4082j  0.8165+0.j    ]] is a left eigenvector for eigenvalue (5-1j)

Matrix version:
This
[[ 1.6330+2.4495j  4.0825+0.8165j]
 [ 1.6330-2.4495j  4.0825-0.8165j]]
should equal this
[[ 1.6330+2.4495j  4.0825+0.8165j]
 [ 1.6330-2.4495j  4.0825-0.8165j]]
现在,
eig
docstring在返回值的描述中也表示:

vl : double or complex ndarray
    The normalized left eigenvector corresponding to the eigenvalue
    ``w[i]`` is the column v[:,i]. Only returned if ``left=True``.
    Of shape ``(M, M)``.

这可能会产生误导,因为左特征向量(例如or)的传统定义是行向量,所以实际上是左特征向量的
vl
列的共轭转置。

谢谢,Warren。据我所知,根据常用惯例,您确认了
vl
的共轭转置是左特征向量。现在的问题是为什么
eig
doscstring提供了这种含糊不清的信息?Fwiw,
A=np.array([[0,1],[1,0]]);w、 L,R=eig(A,左=真,右=真);打印“L*.R:\n”,L.conj().T.dot(R)
会给出
-I
——如果您期望
I
,则会遇到麻烦。一般来说,它可能是np.diag(1-1-11)所以没有快速修复?(版本:numpy 1.14.1 scipy 1.0.0 python 2.7.14 mac 10.10.5)通常,
L.conj().T.dot(R)
必须是对角线,但不一定是标识。存在左特征向量和右特征向量,因此乘积就是恒等式,但是
eig
不能保证计算这样的特征向量。
vl : double or complex ndarray
    The normalized left eigenvector corresponding to the eigenvalue
    ``w[i]`` is the column v[:,i]. Only returned if ``left=True``.
    Of shape ``(M, M)``.