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

问题描述:

我想用Numpy来计算特征值和特征向量。这里是我的代码: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. 你可能已经注意到,该numpy的矩阵v包含的特征向量为水平堆叠,当你打印沃尔弗拉姆结果v1v6

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

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

  4. 最后但并非最不重要:只要它们与它们相应的特征值具有相同的顺序,特征向量的次序是未定义的。所以您需要查看Wolfram的特征值,并可能相应地重新订购v1v6。 (这是由特征值的大小来排序的共同约定。沃尔夫勒姆似乎降序排序,而numpy的按升序排序。)

  5. 在矩阵的情况下,与非唯一特征值,对应的特征向量可以任意旋转,只要它们跨越相应的子空间。但是,在你的例子中,这似乎不是这种情况。

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

+0

谢谢。可能缩放是这里的问题。我想知道在Numpy中是否有任何简单的方法来缩放矢量,使它们看起来与Alpha输出的相似。 – 2014-10-27 20:31:45

+0

@AlekseyLinetskiy:我在Wolfram的缩放中没有看到模式。如果可能的话,可能选择避免分数。但是如果你强迫它,例如通过用“2.01”代替“2”,数字接近你的。 – Falko 2014-10-28 06:39:24