超级简单示例的 Python Numpy 特征向量值不正确
Incorrect Python Numpy Eigenvector Values for Super Simple Example
我正在尝试学习如何使用 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}
特征向量:
对于特征值 -3.414213562373095:
[ 1 ; -1.4142135623730954; 1 ]
对于特征值 -2:
[ -1 ; 0; 1 ]
对于特征值 -0.585786437626905:
[ 1 ; 1.4142135623730954; 1 ]
特征值匹配但特征向量不匹配。
问题:
1. numpy 是否缩放特征向量?
- 如何证明(矩阵点特征向量)与特征向量共线以证明我有正确的特征向量。我在想用特征向量除以点积会显示一个恒定的偏移量,但特征向量 2 不会发生这种情况。也就是说,当我将 numpy 与在线计算器进行比较时,特征向量 2 对我来说并不正确。这是显示共线性的正确方法吗?
Numpy 正在正确计算 eigenvectors/values。您可以通过 运行(问题 2 的答案)进行检查:
print(np.dot(vecs,np.dot(np.diag(vals),vecs.T)) - matrix)
print(np.dot(vecs,vecs.T))
第一个输出告诉您特征值分解与矩阵的近似程度。第二个输出显示特征向量是正交的。这两个条件满足特征值分解的constraints/objective。
问题 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,是两个向量长度的乘积。
documentation for numpy.linalg.eig 声明它 returns
The normalized (unit “length”) eigenvectors
所以是的,向量被归一化了。
特征值 2 的特征向量的值非常接近于零。如果您认为它为零,则答案是正确的,并且与您以其他方式获得的特征向量共线。
检查两个 3D 向量是否共线的一种简单方法是取它们的叉积。如果生成的向量是零向量或非常接近零向量,则向量共线。
我正在尝试学习如何使用 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}
特征向量:
对于特征值 -3.414213562373095: [ 1 ; -1.4142135623730954; 1 ]
对于特征值 -2: [ -1 ; 0; 1 ]
对于特征值 -0.585786437626905: [ 1 ; 1.4142135623730954; 1 ]
特征值匹配但特征向量不匹配。
问题: 1. numpy 是否缩放特征向量?
- 如何证明(矩阵点特征向量)与特征向量共线以证明我有正确的特征向量。我在想用特征向量除以点积会显示一个恒定的偏移量,但特征向量 2 不会发生这种情况。也就是说,当我将 numpy 与在线计算器进行比较时,特征向量 2 对我来说并不正确。这是显示共线性的正确方法吗?
Numpy 正在正确计算 eigenvectors/values。您可以通过 运行(问题 2 的答案)进行检查:
print(np.dot(vecs,np.dot(np.diag(vals),vecs.T)) - matrix)
print(np.dot(vecs,vecs.T))
第一个输出告诉您特征值分解与矩阵的近似程度。第二个输出显示特征向量是正交的。这两个条件满足特征值分解的constraints/objective。
问题 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,是两个向量长度的乘积。
documentation for numpy.linalg.eig 声明它 returns
The normalized (unit “length”) eigenvectors
所以是的,向量被归一化了。
特征值 2 的特征向量的值非常接近于零。如果您认为它为零,则答案是正确的,并且与您以其他方式获得的特征向量共线。
检查两个 3D 向量是否共线的一种简单方法是取它们的叉积。如果生成的向量是零向量或非常接近零向量,则向量共线。