Scipy linalg.eig是否会产生所有可能的特征向量?

时间:2018-08-22 08:13:25

标签: python scipy eigenvector

我有这个矩阵a-

array([[2, 1],
       [1, 2]]) 

此矩阵具有[1, 3]个特征值和以下特征向量:

array([1, -1])
array([1, 1])

但是当我使用Scipy的linalg.eig函数时,它将产生以下结果:

>>>  linalg.eig(a)
(array([3.+0.j, 1.+0.j]), array([[ 0.70710678, -0.70710678],
    [ 0.70710678,  0.70710678]]))

特征值与上面相同,但是此处生成的特征向量与前面提到的特征向量不同。

我在这里想念什么?另外,如何找出矩阵可以具有的特征向量个数?

1 个答案:

答案 0 :(得分:0)

每个特征值有无限多个特征向量。即,如果v是特征向量,而a是任何非零数,那么a*v也是特征向量。因此,任何程序都不可能返回所有特征向量。他们要做的是返回linearly independent个特征向量的最大集合。可以以多种方式选择这样的集合。

对于具有几何多重性1(即一维特征空间)的特征值,几乎可以采用规范的选择:返回范数为1的特征向量。由于u是归一化的,因此这里仍然具有一定程度的任意性。特征向量,-u也是如此。选择哪种算法取决于算法的细节,并且可能从一个线性代数软件包到另一个线性代数软件包都不同。

对于具有大于1的几何多样性的特征值(即2维或更多维的本征空间),任意性程度甚至更大。考虑矩阵

2 0 
0 2

每个非零向量是该矩阵的特征向量。在这里,任何两个线性独立的向量都可以作为答案。 (到目前为止,SciPy返回最明显的选择:[0,1]和[1,0]-但这不是保证。)

在线性代数课程中,可能已经教过为每个本征空间选择一个<正交>基础。不管是好是坏,SciPy并非如此:当本征空间的维数大于1时,它选择的依据不一定是正交的。一个例子是矩阵

1 2 1 1
1 1 1 1
1 1 1 1
1 1 1 1

我在其中输入“ 2”以使其不对称。

from scipy.linalg import eig
import numpy as np
m = np.ones((4, 4))
m[0, 1] = 2
evals, evecs = eig(m)
print(np.around(evals, 2))
print(np.around(evecs, 2))

打印特征值[-0.24, 4.24, 0, 0]和相应的特征向量

[[-0.88  0.58 -0.77 -0.77]
 [ 0.27  0.47 -0.   -0.  ]
 [ 0.27  0.47  0.61  0.16]
 [ 0.27  0.47  0.16  0.61]]

最后两个特征向量来自同一个特征空间(0,多重性2),因此可以选择它们彼此正交,但是SciPy却不这样做。