我有这个矩阵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]]))
特征值与上面相同,但是此处生成的特征向量与前面提到的特征向量不同。
我在这里想念什么?另外,如何找出矩阵可以具有的特征向量个数?
答案 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却不这样做。