关于Numpy中np.linalg.eig()特征向量归一化方式的技术问询
numpy.linalg.eig() 的特征向量归一化与结果差异解析
一、numpy.linalg.eig() 的归一化规则
np.linalg.eig() 返回的特征向量是按L2范数(欧几里得范数)归一化的,即每个特征向量的元素平方和等于1。比如你手动计算的特征向量 [1,1,1],归一化后应为 [1/√3, 1/√3, 1/√3] ≈ [0.577, 0.577, 0.577],这和numpy输出对应特征值9的列完全一致。
二、手动特征向量与numpy输出不一致的原因
你的手动特征向量 trueeigens 是正确的,但要注意两个核心点:
- 特征向量的非唯一性:特征向量代表一个方向,任何非零标量乘以特征向量仍然是该特征值对应的特征向量。此外,对于重特征值(你的矩阵中λ=2是二重根),特征子空间是多维的,numpy求解的特征向量可能是你手动选取基的线性组合——只要落在同一个特征子空间内,就是合法的特征向量。
- 你手动选的λ=2的特征向量是
[-3,0,1]和[1,2,0],而numpy可能选取了这两个向量的线性组合(比如正交化后的结果),这就导致元素值和手动的不同,但仍然满足a1 @ v = λv。
- 你手动选的λ=2的特征向量是
- 数值计算的精度特性:numpy的特征值求解基于LAPACK的数值算法,会存在微小浮点误差,但核心逻辑是正确的。
三、关于可逆性
- 你的矩阵是可对角化的(存在3个线性无关的特征向量),因此numpy返回的特征向量矩阵
eigenvectors是可逆的,满足矩阵对角化公式:a1 ≈ eigenvectors @ np.diag(w) @ np.linalg.inv(eigenvectors) - 你的矩阵特征值均不为0(9、2、2),矩阵本身也是可逆的。
验证示例
运行以下代码可以直接验证特征向量的合法性和归一化规则:
import numpy as np a1 = np.array([[4,-1,6],[2,1,6],[2,-1,8]]) w, eigenvectors = np.linalg.eig(a1) # 验证每个特征向量的L2范数为1 for vec in eigenvectors.T: print(f"向量范数: {np.linalg.norm(vec):.6f}") # 输出应为1.000000左右 # 验证特征向量满足a1@v = λv for idx in range(3): lambda_val = w[idx] vec = eigenvectors[:, idx] lhs = a1 @ vec rhs = lambda_val * vec print(f"特征值{lambda_val:.1f}的验证误差: {np.linalg.norm(lhs - rhs):.6e}") # 误差应极小,接近浮点精度极限
内容的提问来源于stack exchange,提问作者ChefB
相关产品推荐
相关产品推荐

