为何Numpy的eigh函数返回的特征向量验证结果偏离预期?
numpy.linalg.eigh特征向量验证异常的原因
问题重现
我遇到的问题和某Stack Overflow问题类似,但现有解答不适用。以下是我的代码:
import numpy as np matrix = np.array([[10,3,1],[3,2,1],[1,1,1]]) eigenvalues, eigenvectors = np.linalg.eigh(matrix) # 矩阵是对称矩阵,使用eigh 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(数值误差可忽略),但实际返回:
[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 ]]
代入相同验证逻辑后,结果符合预期:
[0.9999999999999705, 0.9999999999834726, 0.9999999999737305]
原因分析
核心错误是numpy.linalg.eigh返回的特征向量矩阵中,每一列对应一个特征向量,而代码中用eigenvectors[i]取的是第i行,这根本不是矩阵的特征向量,自然验证结果偏差极大。
修正方案
将验证逻辑改为取列向量,修正后的代码如下:
import numpy as np matrix = np.array([[10,3,1],[3,2,1],[1,1,1]]) eigenvalues, eigenvectors = np.linalg.eigh(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,符合预期:
[0.9999999999999996, 0.9999999999999998, 1.0]
内容的提问来源于stack exchange,提问作者account google
相关产品推荐
相关产品推荐

