numpy 特征值正确,但特征向量错误

问题描述 投票:0回答:3

我的代码是

print numpy.linalg.eig([[1, 2, 3], [5, 4, 9], [63, 7, 5]])

输出为

(数组([ 21.61455381, -9.76720959, -1.84734422]), 数组([[-0.17186028, -0.14352001, 0.03651047], [-0.48646994,-0.50447076,-0.8471429], [-0.85662772, 0.8514172, 0.53010931]]))

我正在使用在线特征向量计算器来验证http://www.arndt-bruenner.de/mathe/scripts/engl_eigenwert2.htm 给出以下答案:

实特征值:{ -9.767209588804548 ; -1.8473442163236111; 21.61455380512816 }

特征向量:

对于特征值 -9.767209588804548: [ -0.1685660264358372 ; -0.5925071319066865; 1]

对于特征值 -1.8473442163236111: [ 0.06887346700751434 ; -1.5980532339710003; 1]

对于特征值 21.61455380512816: [0.20062423644695662; 0.5678895584242702; 1]

这些值显然不匹配。我哪里错了?

python numpy
3个回答
4
投票

实际上特征向量是正确的,但表述有些令人困惑。如果

eig
的输出是

(数组([1, 2, 3]), 数组([[1, 2, 3], [4, 6, -5], [1, -3, 0]]))

这并不是说特征向量是 [1, 2, 3]、[4, 6, -5] 和 [1, -3, 0]。相反,这些是矩阵中的行,其列是特征向量:

[1  2  3]
[4  6 -5]
[1 -3  0]

因此,在这个虚构的示例中,特征向量将为 [1, 4, 1]、[2, 6, -3] 和 [3, -5, 0],对应于特征值 1、2 和 3,分别。请注意,这些数字是我编造的,因此它们对于任何矩阵来说可能在数学上都没有意义。


3
投票

它们确实匹配(有点......)。

这些特征向量确实彼此相同,但是在线计算器中的特征向量没有标准化(尽管为了方便起见,它们可能应该标准化)。矩阵的特征向量可以按任何标量(数字)缩放,并且仍然是特征向量,因此这不是不正确的,但是约定通常是保持它们标准化,因为这对于其他操作更方便。使用 MATLAB(独立来源)进行快速检查表明 的特征值与 numpy 返回的特征值完全匹配。

您会注意到 numpy 向量满足

norm(eigenvector)=1
的属性。如果您要对在线计算器中的向量进行归一化,那么

eigenvector <- eigenvector/norm(eigenvector)

您会看到它们匹配。


0
投票
#Eigen values and Eigne Vectors

#To find out eigen values numpy is used

#Numpy gives the normalized eigen vectors

#In order to find exact eigen vectors

#Sympy is used

import numpy as np

from numpy.linalg import eig

from sympy import Matrix
#Using Numpy

a = np.array([[-7,-2,10],[-3,2,3],[-6,-2,9]])
w,v=eig(a)
print('Eigen values:', w)
print('Eigen vectors', v)

#Using Sympy
m = Matrix(a)
print(m.eigenvects())

#Result 
#Using Numpy
# Eigen values: [-1.  2.  3.]
# Eigen vectors 

#[[ 8.01783726e-01 -6.66666667e-01  7.07106781e-01]
#  [ 2.67261242e-01 -3.33333333e-01 -1.10591254e-15]
#  [ 5.34522484e-01 -6.66666667e-01  7.07106781e-01]]

#Using Sympy
# [(-1, 1, [Matrix([[3/2],[1/2],[  1]])]), 
#  (2, 1, [Matrix([[  1],[1/2],[  1]])]), 
#  (3, 1, [Matrix([[1],[0],[1]])])]
    
#The second and third vectors are divided by 2
#To get eigen vectors multiply it by 2
© www.soinside.com 2019 - 2024. All rights reserved.