Numpy输出错误的特征向量

dzjeubhm  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(95)

我需要输出一个矩阵的特征值和特征向量。使用numpy.linalg.eig这样的函数,这似乎是一个微不足道的任务。事实证明,它输出正确的特征值,但有一些错误的特征向量。
假设我们有一个矩阵A:


的数据
我们知道这个的特征值是:



类似地,其特征向量为:




所以用这个公式,



对于第一特征值,我们有:



你可以使用下面的代码来测试它:

import numpy as np

A = np.array([[0, 2],
              [2, 3]])
I = np.eye(2)

eigenvector = [[1, 2], 
               [-2, 1]]
eigenvalue = [4, -1]

for i in range(2):
    print(f"eigenvalue = {eigenvalue[i]}, eigenvector = {eigenvector[i]}")
    print(f"(A-λ*I)v = {(A-eigenvalue[i]*I)@eigenvector[i]}")
    print(" ")

字符串
然而,如果我们尝试numpy.linalg.eig来计算特征向量和特征值,我们会遇到一些问题。
这会发现以下不正确的特征值:



类似地,它找到的特征向量是:




现在,当我们测试第一个特征向量时,我们得到的结果不同于零:



你可以使用下面的代码看到这一点:

import numpy as np
from numpy.linalg import eig

A = np.array([[0, 2],
              [2, 3]])
I = np.eye(2)

eigenvalue, eigenvector = eig(A)
for i in range(2):
    print(f"eigenvalue = {eigenvalue[i]}, eigenvector = {eigenvector[i]}")
    print(f"(A-λ*I)v = {(A-eigenvalue[i]*I)@eigenvector[i]}")
    print(" ")


我做错了什么?如何使用numpy.linalg.eig得到正确的特征向量?

cgfeq70w

cgfeq70w1#

Numpy返回归一化的特征向量,即它们具有单位长度(如documentation所示)。此外,您需要选择第一列以获得第一个特征向量。如果你使用eigenvector[:, 0]*np.sqrt(5),你会看到特征向量与你手工计算的相同。

2lpgd968

2lpgd9682#

首先是几个格式注解。
对于普通浏览器,数学符号不是特别可读,例如第一个月
当运行带有打印结果的代码时,如果您实际显示结果,那就太好了。因此:

In [72]: i = 0
    ...: print('eigenvalue = {}, eigenvector = {}'.format(eigenvalue[i],eigenvector[i]))
    ...: print('(A-λ*I)v = {}'.format(np.matmul((A-eigenvalue[i]*I),eigenvector[i])))
    ...: print(' ')
    ...: i = 1
    ...: print('eigenvalue = {}, eigenvector = {}'.format(eigenvalue[i],eigenvector[i]))
    ...: print('(A-λ*I)v = {}'.format(np.matmul((A-eigenvalue[i]*I),eigenvector[i])))
eigenvalue = -1.0, eigenvector = [-0.89442719 -0.4472136 ]
(A-λ*I)v = [-1.78885438 -3.57770876]
 

eigenvalue = 4.0, eigenvector = [ 0.4472136  -0.89442719]
(A-λ*I)v = [-3.57770876  1.78885438]

字符串
使用numpy可以打印整个数组,例如

In [75]: eigenvalue
Out[75]: array([-1.,  4.])

In [76]: eigenvector
Out[76]: 
array([[-0.89442719, -0.4472136 ],
       [ 0.4472136 , -0.89442719]])


将其与您的价值观进行比较:

eigenvector = [[1, 2], [-2, 1]]
eigenvalue = [4, -1]


eigenvalue顺序切换; eigenvector值的比例为2:1。匹配符号(按列)需要更多的思考。
如果我们用列代替行,

In [77]: i = 0
    ...: print('(A-λ*I)v = {}'.format(np.matmul((A-eigenvalue[i]*I),eigenvector[:,i])))
    ...: print(' ')
    ...: i = 1
    ...: print('(A-λ*I)v = {}'.format(np.matmul((A-eigenvalue[i]*I),eigenvector[:,i])))
(A-λ*I)v = [0. 0.]
(A-λ*I)v = [0. 0.]


[numpy] eigenvectors的快速搜索显示,错误的行和列至少可以追溯到2015年。

相关问题