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生成的结果相同的结果?
非常感谢您的帮助!
答
结果由于多种原因不同:
你可能已经注意到,该numpy的矩阵
v
包含的特征向量为水平堆叠列,当你打印沃尔弗拉姆结果v1
到v6
如行。规模(或长度)的特征向量未定义。所以它通常会缩放到1的长度。Wolfram结果的缩放比例不同,我猜这会造成一些混淆。
请注意,通过缩放向量,即使符号可以更改。这就是正面和负面因素可能翻转的原因。
最后但并非最不重要:只要它们与它们相应的特征值具有相同的顺序,特征向量的次序是未定义的。所以您需要查看Wolfram的特征值,并可能相应地重新订购
v1
至v6
。 (这是由特征值的大小来排序的共同约定。沃尔夫勒姆似乎降序排序,而numpy的按升序排序。)在矩阵的情况下,与非唯一特征值,对应的特征向量可以任意旋转,只要它们跨越相应的子空间。但是,在你的例子中,这似乎不是这种情况。
考虑到前4个问题,结果实际上非常接近。奇点应该不重要,因为只有一个零特征值,因此相应的特征向量是唯一的(达到符号和长度)。
谢谢。可能缩放是这里的问题。我想知道在Numpy中是否有任何简单的方法来缩放矢量,使它们看起来与Alpha输出的相似。 – 2014-10-27 20:31:45
@AlekseyLinetskiy:我在Wolfram的缩放中没有看到模式。如果可能的话,可能选择避免分数。但是如果你强迫它,例如通过用“2.01”代替“2”,数字接近你的。 – Falko 2014-10-28 06:39:24