超简单示例的Python Numpy特征向量值不正确

时间:2018-01-28 23:51:23

标签: python numpy linear-algebra

我试图在一个简单的例子中学习如何使用numpy来确定特征向量和值,但结果看起来不正确。这是我的代码:

import numpy as np
import numpy.linalg as la

# create the matrix
matrix = np.array([[-2, 1, 0], [1, -2, 1], [0, 1, -2]])
print("Matrix:\n", matrix)

# calculate the eigenvalues and vectors
vals, vecs = np.linalg.eigh(matrix)

# print the eigenvalues and vectores
print("vals:\n", vals)
print("vecs:\n", vecs)

# get the eigenvectors
v1 = vecs[:,0]
v2 = vecs[:,1]
v3 = vecs[:,2]

print("v1:", v1)
print("v2:", v2)
print("v3:", v3)

# compute dot
dot1 = np.dot(matrix, v1)
dot2 = np.dot(matrix, v2)
dot3 = np.dot(matrix, v3)

# is the dot collinear to the eigenvectors?
print("dot1 / v1", dot1 / v1)
print("dot2 / v2", dot2 / v2)
print("dot3 / v3", dot3 / v3)

这是输出:

Matrix:
 [[-2  1  0]
 [ 1 -2  1]
 [ 0  1 -2]]
vals:
 [-3.41421356 -2.         -0.58578644]
vecs:
 [[  5.00000000e-01  -7.07106781e-01  -5.00000000e-01]
 [ -7.07106781e-01   4.88509860e-17  -7.07106781e-01]
 [  5.00000000e-01   7.07106781e-01  -5.00000000e-01]]
v1: [ 0.5        -0.70710678  0.5       ]
v2: [ -7.07106781e-01   4.88509860e-17   7.07106781e-01]
v3: [-0.5        -0.70710678 -0.5       ]
dot1 / v1 [-3.41421356 -3.41421356 -3.41421356]
dot2 / v2 [-2.         -4.54534541 -2.        ]
dot3 / v3 [-0.58578644 -0.58578644 -0.58578644]

当我使用在线计算器(http://www.arndt-bruenner.de/mathe/scripts/engl_eigenwert2.htm)计算特征向量时,我得到: 真实特征值:{ - 3.414213562373095; -2; -0.585786437626905}

特征向量:

for Eigenvalue -3.414213562373095:    [1; -1.4142135623730954; 1]

表示特征值-2:    [-1; 0; 1]

for Eigenvalue -0.585786437626905:    [1; 1.4142135623730954; 1]

特征值匹配,但特征向量不匹配。

问题: 1. numpy是否缩放了特征向量?

  1. 如何证明(矩阵点特征向量)与特征向量共线以证明我具有正确的特征向量。我认为将点积除以特征向量会显示一个恒定的偏移,但对于特征向量2并不会发生。也就是说,当我将numpy与numpy进行比较时,特征向量2看起来并不正确。在线计算器。这是显示共线性的正确方法吗?

2 个答案:

答案 0 :(得分:2)

Numpy正确计算特征向量/值。您可以通过运行(回答问题2)来检查:

print(np.dot(vecs,np.dot(np.diag(vals),vecs.T)) - matrix)
print(np.dot(vecs,vecs.T))

第一个输出告诉您特征值分解与矩阵的近似程度。第二个输出显示特征向量是正交的。这两个条件满足特征值分解的约束/目标。

问题1:是的,numpy将特征向量的长度标准化为1。

lengths = [print(la.norm(vecs[:,i])) for i in range(3)]

注意:你也可以通过计算它们的点积来确认两种方法中的特征向量是等价的:

print(np.dot(vecs[:,0],[ -1, 0, 1 ]))

是零,而

np.dot(vecs[:,0],[ 1, -1.4142135623730954, 1 ]) 

是2,这是两个向量的长度的乘积。

答案 1 :(得分:1)

documentation for numpy.linalg.eig表示它返回

  

标准化(单位“长度”)特征向量

所以是的,矢量被标准化了。

特征值2的特征向量具有非常接近零的值。如果你认为它是零,答案是正确的,并且与你从另一个方向得到的特征向量共线。

检查两个3D矢量是否共线的一种简单方法是采用它们的叉积。如果得到的向量是零向量或非常接近它,则向量是共线的。