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

关于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 是正确的,但要注意两个核心点:

  1. 特征向量的非唯一性:特征向量代表一个方向,任何非零标量乘以特征向量仍然是该特征值对应的特征向量。此外,对于重特征值(你的矩阵中λ=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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:53:23