python - 使用 NumPy 计算特征向量的说明

标签 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 的差异以及发生了什么?它是用数值求解的吗,这些不是真正的特征向量,但它们似乎在某种意义上满足了一定数值精度水平内的条件?谢谢。

最佳答案

这里,特征值 3 的几何重数为 2(矩阵 (A - 3 I) 的秩为 1),有无穷多种选择方式此特征空间的两个基向量(特征向量)。

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

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

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

Each eigenvector is scaled so that the Euclidean norm is 1 and the largest component is real.

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

关于python - 使用 NumPy 计算特征向量的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48750689/

相关文章:

c++ - 打印这个矩阵的 if 语句是什么

function - 以矩阵接口(interface)为参数的Go函数

python - 如何加速我在 hadoop 上的 tensorflow 执行?

python - 处理正则表达式中的空格

python - 如何使用命令更新 Django 中用户配置文件中的属性?

python - 将 sys.stdout 重定向到 python 日志记录

python - 如何从一系列点计算从一个点到每个其他点的相对向量

python : simple array manipulation with Numpy

python - 从记录中用 Pandas 索引几个 csv 文件?

c++ - OpenGL 按面着色