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

Python Numpy似乎产生了不正确的特征向量,python,numpy,eigenvector,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,

我想用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计算的链接:

为什么我会得到不同的结果?我应该在Python中做什么才能得到与Alpha相同的结果


非常感谢你的帮助

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

  • 您可能注意到,当您将Wolfram结果
    v1
    打印到
    v6
    时,numpy矩阵
    v
    包含水平堆叠的的特征向量

  • 特征向量的尺度(或长度)未定义。所以它通常被缩放到长度1。Wolfram结果的缩放方式不同,我想这会引起一些混乱

  • 请注意,通过缩放向量,即使是符号也可以更改。这就是为什么积极和消极的因素可能会被翻转

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

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


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

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

  • 您可能注意到,当您将Wolfram结果
    v1
    打印到
    v6
    时,numpy矩阵
    v
    包含水平堆叠的的特征向量

  • 特征向量的尺度(或长度)未定义。所以它通常被缩放到长度1。Wolfram结果的缩放方式不同,我想这会引起一些混乱

  • 请注意,通过缩放向量,即使是符号也可以更改。这就是为什么积极和消极的因素可能会被翻转

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

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


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

    谢谢。可能缩放是这里的问题。我想知道在Numpy中是否有任何简单的方法来缩放向量,使它们看起来与Alpha输出类似。@AlekseyLinetskiy:我在Wolfram的缩放中没有看到模式。如果可能的话,选择它可能是为了避免分数。但是如果你强迫它,例如用“2.01”替换“2”,数字就会接近你的。我认为你不能通过缩放来改变符号,特征向量表示一个特定的方向,这就是为什么我们可以缩放它,因为方向不会改变。但是一旦你改变了符号,方向就会翻转,这就违背了获得特征向量的目的。谢谢。可能缩放是这里的问题。我想知道在Numpy中是否有任何简单的方法来缩放向量,使它们看起来与Alpha输出类似。@AlekseyLinetskiy:我在Wolfram的缩放中没有看到模式。如果可能的话,选择它可能是为了避免分数。但是如果你强迫它,例如用“2.01”替换“2”,数字就会接近你的。我认为你不能通过缩放来改变符号,特征向量表示一个特定的方向,这就是为什么我们可以缩放它,因为方向不会改变。但是一旦你改变了符号,方向就会翻转,这就违背了获得特征向量的目的。