numpy.linalg.eig没有找到明显的特征向量
numpy.linalg.eig does not find obvious eigen vector
我有一个矩阵 A
如下:
A
Out[34]:
array([[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1]])
我想求特征值和特征向量。
考虑一个向量 x
如下:
x
Out[35]: array([4, 4, 4, 4, 0, 0, 0, 0])
这是一个特征向量,如下所示:
np.matmul(A, x) == 4 * x
Out[36]: array([ True, True, True, True, True, True, True, True])
(np.matmul(A, x) == 4 * x).all()
Out[37]: True
但是,当我使用 np.linalg.eig
计算特征向量时,它不包括 x(或 x 的缩放向量)。
l, v = np.linalg.eig(A)
l
Out[40]: array([0., 4., 0., 0., 0., 4., 0., 0.])
v
Out[41]:
array([[-8.66025404e-01, 5.00000000e-01, -2.77555756e-17,
-2.77555756e-17, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00],
[ 2.88675135e-01, 5.00000000e-01, -5.77350269e-01,
-5.77350269e-01, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00],
[ 2.88675135e-01, 5.00000000e-01, 7.88675135e-01,
-2.11324865e-01, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00],
[ 2.88675135e-01, 5.00000000e-01, -2.11324865e-01,
7.88675135e-01, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, -8.66025404e-01, 5.00000000e-01,
-2.77555756e-17, -2.77555756e-17],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 2.88675135e-01, 5.00000000e-01,
-5.77350269e-01, -5.77350269e-01],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 2.88675135e-01, 5.00000000e-01,
7.88675135e-01, -2.11324865e-01],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 2.88675135e-01, 5.00000000e-01,
-2.11324865e-01, 7.88675135e-01]])
虽然包含特征值 4,但缺少特征向量。我错过了什么吗?
解决方法正确。如果你检查,
import numpy as np
A = np.array([[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1]])
l, v = np.linalg.eig(A)
print(v[:, 1])
给出 [0.5 0.5 0.5 0.5 0. 0. 0. 0. ]
这是特征向量,它是您正在寻找的向量的标量倍数。该函数给出了归一化向量,这就是为什么它都是 0.5 而不是 4。但是,它们在这种情况下是等价的。
我有一个矩阵 A
如下:
A
Out[34]:
array([[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1]])
我想求特征值和特征向量。
考虑一个向量 x
如下:
x
Out[35]: array([4, 4, 4, 4, 0, 0, 0, 0])
这是一个特征向量,如下所示:
np.matmul(A, x) == 4 * x
Out[36]: array([ True, True, True, True, True, True, True, True])
(np.matmul(A, x) == 4 * x).all()
Out[37]: True
但是,当我使用 np.linalg.eig
计算特征向量时,它不包括 x(或 x 的缩放向量)。
l, v = np.linalg.eig(A)
l
Out[40]: array([0., 4., 0., 0., 0., 4., 0., 0.])
v
Out[41]:
array([[-8.66025404e-01, 5.00000000e-01, -2.77555756e-17,
-2.77555756e-17, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00],
[ 2.88675135e-01, 5.00000000e-01, -5.77350269e-01,
-5.77350269e-01, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00],
[ 2.88675135e-01, 5.00000000e-01, 7.88675135e-01,
-2.11324865e-01, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00],
[ 2.88675135e-01, 5.00000000e-01, -2.11324865e-01,
7.88675135e-01, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, -8.66025404e-01, 5.00000000e-01,
-2.77555756e-17, -2.77555756e-17],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 2.88675135e-01, 5.00000000e-01,
-5.77350269e-01, -5.77350269e-01],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 2.88675135e-01, 5.00000000e-01,
7.88675135e-01, -2.11324865e-01],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 2.88675135e-01, 5.00000000e-01,
-2.11324865e-01, 7.88675135e-01]])
虽然包含特征值 4,但缺少特征向量。我错过了什么吗?
解决方法正确。如果你检查,
import numpy as np
A = np.array([[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1]])
l, v = np.linalg.eig(A)
print(v[:, 1])
给出 [0.5 0.5 0.5 0.5 0. 0. 0. 0. ]
这是特征向量,它是您正在寻找的向量的标量倍数。该函数给出了归一化向量,这就是为什么它都是 0.5 而不是 4。但是,它们在这种情况下是等价的。