使用NumPy对特征向量计算的澄清

时间:2018-02-12 16:08:16

标签: python numpy matrix linear-algebra eigenvector

我正在审查一些线性代数并在Python中完成一些实现。我正在解决与查找矩阵A的特征向量相关的问题。

A = [[ 1, 2,-2], 
     [-2, 5,-2], 
     [-6, 6,-3]]

当我手动解决这个问题时,我得到特征值3和-3,其中3的多重性为2.我的特征向量是[[1/3], [1/3], [1]], [[1], [1], [0]], [[-1], [0], [1]]

在NumPy中尝试我的实现:

import numpy as np
A = [[ 1, 2, -2], 
     [-2, 5, -2], 
     [-6, 6, -3]]
np.linalg.eig(A)

给出输出

(array([ 3., -3.,  3.]), array([[ 0.53452248, -0.30151134, -0.05332571],
                                [-0.26726124, -0.30151134, -0.73225996],
                                [-0.80178373, -0.90453403, -0.67893425]]))

特征值是我所期望的,但特征向量让我感到困惑。根据我所读过的内容,我了解它们是列,并且它们已经标准化,即norm(e1) = 1。而且,从数字上看,它们在满足Ax = lambda * x方程的意义上似乎是正确的。

此外,当我在SymPy中执行实现时,我得到了预期的结果。

from sympy.matrices import Matrix, eye, zeros, ones, diag, GramSchmidt
A = Matrix([[ 1, 2, -2], 
            [-2, 5, -2], 
            [-6, 6, -3]])
A.eigenvects()

输出:

[(-3, 1, [Matrix([
[1/3],
[1/3],
[  1]])]), (3, 2, [Matrix([
[1],
[1],
[0]]), Matrix([
[-1],
[ 0],
[ 1]])])]

任何人都可以了解NumPy的差异和发生的事情吗?它是用数字方式求解的,而且它们不是真正的特征向量,但它们似乎在某种意义上它们满足一定数值精度水平的条件?谢谢。

1 个答案:

答案 0 :(得分:4)

这里,特征值3具有几何多重性2(矩阵的秩( A - 3 I )是1)并且有无数种方式可供选择这个本征空间的两个基矢量(特征向量)。

normal matrix A 的情况下,numpy.linalg.eig将返回一组行特征向量,形成整个空间的一组正交基,并在计算实践中返回特征向量每列中的排列和方向(符号)都是唯一的。在非正常情况下(如此处),没有唯一的选择,只有整个空间的唯一分区成为与每个特征值相关联的子(本征)空间。

您可以将特征值3(即返回的特征向量数组中的第0和第2列)的输出特征向量视为满足特征值方程的任意基集。

实现应该是LAPACK API的基础?GEEV函数的包装器。除了匹配特征值的顺序(以共轭对排序)之外,输出特征向量的唯一约束似乎

  

每个特征向量都被缩放,因此欧几里德范数为1,最大分量为实数。

所以仍有很多任意性,我不会指望特定的输出。