Numpy似乎产生了不正确的特征向量

时间:2014-10-27 14:11:59

标签: python numpy eigenvector

我想使用Numpy来计算特征值和特征向量。这是我的代码:

import numpy as np
from numpy import linalg as LA

lapl = np.array(
       [[ 2, -1, -1,  0,  0,  0],
        [-1,  3,  0, -1,  0, -1],
        [-1,  0,  2, -1,  0,  0],
        [ 0, -1, -1,  3, -1,  0],
        [ 0,  0,  0, -1,  2, -1],
        [ 0, -1,  0,  0, -1,  2]])

w, v = LA.eigh(lapl)

print ('Eigenvalues:', np.round(w,0))
print ('Eigenvectors:', np.round(v,2))

结果如下:

Eigenvalues: [ 0.  1.  2.  3.  3.  5.]
Eigenvectors: [[ 0.41  0.5   0.41 -0.46  0.34  0.29]
               [ 0.41  0.    0.41  0.53  0.23 -0.58]
               [ 0.41  0.5  -0.41 -0.07 -0.57 -0.29]
               [ 0.41  0.   -0.41  0.53  0.23  0.58]
               [ 0.41 -0.5  -0.41 -0.46  0.34 -0.29]
               [ 0.41 -0.5   0.41 -0.07 -0.57  0.29]]

然而,当我在Wolfram Alpha中运行相同的矩阵时,我得到的结果不同 - 特征值相同,但特征向量不同:

v1 = ( 1, -2, -1,  2, -1,  1)
v2 = ( 0, -1,  1, -1,  0,  1)
v3 = ( 1, -1,  0, -1,  1,  0)
v4 = ( 1,  1, -1, -1, -1,  1)
v5 = (-1,  0, -1,  0,  1,  1)
v6 = ( 1,  1,  1,  1,  1,  1)

以下是Wolfram Alpha计算的链接:http://bit.ly/1wC9EHJ

为什么我会得到不同的结果?我应该在Python中做些什么来获得与Alpha生成的相同的结果?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:7)

由于多种原因,结果有所不同:

  1. 您可能已经注意到,numpy矩阵v包含特征向量作为水平堆叠,而您将Wolfram结果v1打印到{{ 1}}为

  2. 特征向量的比例(或长度)未定义。因此它通常按比例缩放到1. Wolfram结果的缩放比例不同,这会导致一些混乱,我猜。

  3. 请注意,通过缩放矢量,即使符号也可以更改。这就是为什么正面和负面元素可能被翻转的原因。

  4. 最后但并非最不重要的是:特征向量的顺序是未定义的,只要它们的顺序与相应的特征值相同即可。因此,您还需要查看Wolfram的特征值,并可能相应地将v6重新排序为v1。 (根据特征值的大小排序是一种常见的约定.Wolfram似乎按降序排序,而numpy按升序排序。)

  5. 如果矩阵具有非唯一特征值,则相应的特征向量可以任意旋转,只要它们跨越相应的子空间即可。但是,在您的示例中似乎并非如此。

  6. 考虑到前4个问题,结果实际上非常接近。奇点应该无关紧要,因为只有一个零特征值,因此相应的特征向量是唯一的(直到符号和长度)。