You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:57:07