为什么输入不同的特征向量会得到不同的结果?
我正在尝试从一组特征向量和特征值构建一个矩阵A,然后再反向操作以获取特征向量和特征值。我发现通常无法恢复我最开始的特征值和特征向量组合,而且我不太明白为什么会这样。
我明白这可能是一个数学问题,而不是编程问题——但我想在这里问问,因为也有可能是我在使用numpy时做了什么傻事。
evecs = np.array([[6.12e-32, 0.00, 1.0], [0.71, 0.71, 0.00], [-0.71, 0.71, 0.00]])
evals =np.diag(np.array([0.6, 0.3, 0.1]))
A = np.dot(np.dot(evecs, evals), np.linalg.inv(evecs))
eigenvalues, eigenvectors = np.linalg.eig(A)
这个操作返回了:
print (eigenvalues)
[0.1 0.6 0.3]
print (eigenvectors)
[[ 1.000000000000000e+00 6.095061268819254e-32 5.775657482482331e-49]
[ 0.000000000000000e+00 7.071067811865475e-01 7.071067811865475e-01]
[ 0.000000000000000e+00 -7.071067811865475e-01 7.071067811865475e-01]]
我知道特征值返回时是无序的,但即便如此,和最大特征值对应的特征向量现在变成了:
print (eigenvectors[:,1])
[ 6.095061268819254e-32 7.071067811865475e-01 -7.071067811865475e-01]
这和我最开始输入的v1 = [0, 0, 1]不一样。为什么特征向量的轴会这样切换呢?有没有什么方法可以让我恢复v1的原始方向?
在寻找解决方案的过程中,我还看到很多地方提到计算逆矩阵应该避免——有没有更好的(更稳定的)方法可以从特征空间转换到A(再回去)呢?
1 个回答
1
在你的实现中,evecs
的行是特征向量,但它们应该是列。
通过对 evecs
进行转置,你就能得到想要的结果:
import numpy as np
evecs = np.array([[6.12e-32, 0.00, 1.0], [0.71, 0.71, 0.00], [-0.71, 0.71, 0.00]])
evecs = evecs.T
evals =np.diag(np.array([0.6, 0.3, 0.1]))
A = np.dot(np.dot(evecs, evals), np.linalg.inv(evecs))
eigenvalues, eigenvectors = np.linalg.eig(A)
print (eigenvalues)
print (eigenvectors)
print (eigenvectors[:,2])
[0.3 0.1 0.6]
[[ 7.07106781e-01 -7.07106781e-01 6.12000000e-32]
[ 7.07106781e-01 7.07106781e-01 7.54333276e-48]
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
[6.12000000e-32 7.54333276e-48 1.00000000e+00]