Skip to main content
 首页 » 编程设计

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

2025年05月04日16cyq1162

我想使用 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. 您可能已经注意到,当您打印 Wolfram 结果 v1< 时,numpy 矩阵 v 包含作为水平堆叠的 列 的特征向量 到 v6 作为 行。

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

  3. 请注意,通过缩放矢量,甚至 符号 也可以改变。这就是正面和负面元素可能会颠倒的原因。

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

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

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