为什么输入不同的特征向量会得到不同的结果?

1 投票
1 回答
55 浏览
提问于 2025-04-14 17:24

我正在尝试从一组特征向量和特征值构建一个矩阵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]

撰写回答