为什么我的Numpy代码返回不正确的特征向量值?

kupeojn6  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(166)

我遇到的问题与this question相同。
但是,我相信上述问题的答案并不适用于我的情况。

matrix = np.array([[10,3,1],[3,2,1],[1,1,1]])
    eigenvalues, eigenvectors =np.linalg.eigh(matrix) # using eigh because matrix is symmetric matrix
    print([np.dot((matrix@eigenvectors[i])/np.linalg.norm(matrix@eigenvectors[i]),eigenvectors[i]/np.linalg.norm(eigenvectors[i])) for i in range(matrix.shape[0])])

如果我是正确的,上面的代码应该返回1,等于矩阵的大小。当然,我假设由于错误,它不会正好是1,但它仍然应该接近1。
但是,上面的代码返回以下值:

[0.7721913042777805, 0.5341128829187937, 0.9019035049538643]

这个答案是不是太差了?
顺便说一下,如果我们在Wolfram Alpha中计算这个矩阵的特征向量,我得到:

[[ 0.12586458 -0.32039088 -0.93888646]]
 [-0.65562141 0.68341326 -0.32110261]
 [ [ 0.74452581 0.65596951 -0.1240376 ]]

将其代入特征向量并以相同的方式执行以下代码,

print([np.dot((matrix@eigenvectors[i])/np.linalg.norm(matrix@eigenvectors[i]),eigenvectors[i]/np.linalg.norm(eigenvectors[i])) for i in range(matrix.shape[0])])

获得以下结果:

[0.9999999999999705, 0.9999999999834726, 0.9999999999737305]
f4t66c6m

f4t66c6m1#

Numpy正在正确计算特征向量,您可以通过使用print语句显示它们来验证它。问题是你取的特征向量不正确。使用eigh时,请确保采用特征向量矩阵的列,而不是像您当前所做的那样采用行。
解决方案如下:

print([np.dot(matrix @ eigenvectors[:, i] / np.linalg.norm(matrix @ eigenvectors[:, i]), eigenvectors[:, i]) for i in range(matrix.shape[0])])

做了这个小小的修改,我得到了预期的结果:

[0.9999999999999998, 0.9999999999999996, 0.9999999999999996]

让我知道它是否有效:)

相关问题