Python中的广义特征值问题求解函数eig无法返回正确的特征向量

4
尝试使用scipy的linalg.eig来解决广义特征值问题。然后我检查得到的解决方案,似乎没有返回正确的特征向量。此外,文档建议返回的向量已经被归一化,但事实并非如此(虽然这对我影响不大)。
以下是示例矩阵:
>>> a
array([[  2.05630374e-01,   8.89584493e-10,  -1.46171715e-06],
       [  8.89584493e-10,   2.38374743e-02,   9.43440334e-06],
       [ -1.46171715e-06,   9.43440334e-06,   1.39685787e-02]])
>>> b
array([[ 0.22501692, -0.07509864, -0.05774453],
       [-0.07509864,  0.02569336,  0.01976284],
       [-0.05774453,  0.01976284,  0.01524993]])

运行eig函数,我得到了:

>>> w,v = linalg.eig(a,b)
>>> w
array([  3.08431414e-01+0.j,   5.31170281e+01+0.j,   6.06298605e+02+0.j])
>>> v
array([[-0.26014092, -0.46277857, -0.0224057 ],
       [ 0.76112351, -0.59384527, -0.83594841],
       [ 1.        , -1.        ,  1.        ]])

然后测试结果:

>>> a*v[:,0]
array([[ -5.34928750e-02,   6.77083674e-10,  -1.46171715e-06],
       [ -2.31417329e-10,   1.81432622e-02,   9.43440334e-06],
       [  3.80252446e-07,   7.18074620e-06,   1.39685787e-02]])
>>> w[0]*b*v[:,0]
array([[-0.01805437+0.j, -0.01762974+0.j, -0.01781023+0.j],
       [ 0.00602559-0.j,  0.00603163+0.j,  0.00609548+0.j],
       [ 0.00463317-0.j,  0.00463941+0.j,  0.00470356+0.j]])

我以为这两个会相等,但它们不一样...我还尝试使用eigh,但没有成功。我需要帮助,显然我漏掉了什么。


你使用的scipy版本是什么?我很惊讶,因为eig应该返回3个数组! - Nicolas Barbey
使用0.10.1版本。如果我理解正确,默认情况下只返回右特征向量,请参见:http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.eig.html 因此只返回两个数组。 - nickb
1个回答

5
你可以通过查看输出的形状来了解情况。你的a*v[:,0]应该给出一个向量,那么为什么你得到了一个3x3的数组呢?答案是:因为你没有进行矩阵乘法,而是进行了逐元素的数组乘法。
换句话说,你做了:
>>> a * v[:,0]
array([[ -5.34928759e-02,   6.77083679e-10,  -1.46171715e-06],
       [ -2.31417334e-10,   1.81432623e-02,   9.43440334e-06],
       [  3.80252453e-07,   7.18074626e-06,   1.39685787e-02]])
>>> w[0] * b * v[:,0]
array([[-0.01805437+0.j, -0.01762974+0.j, -0.01781023+0.j],
       [ 0.00602559-0.j,  0.00603163+0.j,  0.00609548+0.j],
       [ 0.00463317-0.j,  0.00463941+0.j,  0.00470356+0.j]])

当你真正想要的时候
>>> a.dot(v[:,0])
array([-0.05349434,  0.0181527 ,  0.01397614])
>>> w[0] * b.dot(v[:,0])
array([-0.05349434+0.j,  0.01815270+0.j,  0.01397614+0.j])

或者

>>> matrix(a)*matrix(v[:,0]).T
matrix([[-0.05349434],
        [ 0.0181527 ],
        [ 0.01397614]])
>>> w[0]*matrix(b)*matrix(v[:,0]).T
matrix([[-0.05349434+0.j],
        [ 0.01815270+0.j],
        [ 0.01397614+0.j]])

谢谢!有什么想法为什么特征向量没有被归一化吗? - nickb
在我看来,它们已经被归一化了:每个向量的最大绝对值为1。这可能不是您期望的归一化,但它确实是一种归一化.. :^) - DSM
归一化直接来自LAPACK:http://www.netlib.org/lapack/double/dggev.f - pv.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接