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

矩阵极分解实现疑问:Numpy特征值与视频方法的差异

矩阵极分解:手动实现与Numpy特征值计算的差异解析

一、手动实现的代码与验证

按照教程提供的特征值和特征向量,手动实现极分解的代码如下:

import numpy as np

A = np.array([[4,-14,1],[22,23,18],[15,10,20]])
A_T_multiply_A = np.array(A.T @ A)
print("A transpose into A")
print(A_T_multiply_A)

x = np.array([[-1,1,1],[0,-2,1],[1,1,1]])           # 特征向量矩阵(列向量为特征向量)
y = np.array([[25,0,0],[0,225,0],[0,0,2025]])      # 特征值对角矩阵
z = np.linalg.inv(np.array([[-1,1,1],[0,-2,1],[1,1,1]]))    # 特征向量矩阵的逆
A_transpose_A = x @ y @ z
print("A transpose A by multiplying Eigen vectors, Eigen values and Inv of Eigen vectors")
print(A_transpose_A)  
P  = x @ np.sqrt(y) @ z
print("Matrix P")
print(P)
U = A @ np.linalg.inv(P)
print("Matrix U")
print(U)

该代码能得到正确的正交矩阵U和半正定矩阵P。

二、Numpy计算特征值/特征向量的代码与结果

使用numpy.linalg.eig计算$A^T A$的特征值和特征向量的代码如下:

import numpy as np

# 定义矩阵
A = np.array([[4,-14,1],
              [22,23,18],
              [15,10,20]])
A_T_multiply_A = np.array(A.T @ A)

# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A_T_multiply_A)

# 打印结果
print("Eigenvalues:")
print(eigenvalues)

print("\nEigenvectors:")
print(eigenvectors)

输出结果为:

Eigenvalues:
[2025.   25.  225.]

Eigenvectors:
[[-5.77350269e-01 -7.07106781e-01  4.08248290e-01]
 [-5.77350269e-01 -3.91901695e-16 -8.16496581e-01]
 [-5.77350269e-01  7.07106781e-01  4.08248290e-01]]

可以看到,该结果与教程提供的特征值、特征向量存在明显差异。

三、Scipy Polar API的参考结果

使用Scipy内置的极分解API直接计算的代码如下:

import numpy as np
from scipy.linalg import polar
A = np.array([[4,-14,1],[22,23,18],[15,10,20]])
U, P = polar(A)
print("Matrix U=")
print(U)
print("Matrix P=")
print(P)

输出结果为:

Matrix U=
[[ 6.00000000e-01 -8.00000000e-01  2.40023768e-16]
 [ 8.00000000e-01  6.00000000e-01  3.21346710e-16]
 [ 2.32191141e-16  6.61562711e-17  1.00000000e+00]]
Matrix P=
[[20. 10. 15.]
 [10. 25. 10.]
 [15. 10. 20.]]

该结果是极分解的标准正确输出。

四、差异原因解析

Numpy计算结果与教程的差异完全是特征值/特征向量的表现形式差异,而非计算错误,具体原因如下:

  1. 特征值顺序不同:
    Numpy的linalg.eig函数返回的特征值没有固定的排序规则(并非严格按大小升序/降序),但返回的特征值集合与教程完全一致(都是25、225、2025),只是排列顺序不同。

  2. 特征向量的形式差异:

    • 归一化处理:教程中使用的是未归一化的整数特征向量,而Numpy返回的是**单位化(长度为1)**的特征向量,二者成比例(比如教程中对应特征值225的特征向量是[1,-2,1],Numpy返回的是该向量除以其模长$\sqrt{12+(-2)2+1^2}=\sqrt{6}$后的结果),本质属于同一个特征空间。
    • 符号差异:特征向量的符号不唯一——如果$\mathbf{v}$是特征向量,那么$-\mathbf{v}$同样满足特征方程$A\mathbf{v}=\lambda\mathbf{v}$。Numpy返回的部分特征向量与教程中的向量符号相反,这是完全合法的。

只要基于Numpy的结果正确构造特征值对角矩阵(按特征向量的对应顺序),并计算$P = V \sqrt{\Lambda} VT$(由于$AT A$是对称矩阵,特征向量矩阵$V$正交,其逆等于转置),最终得到的P和U会与Scipy的结果完全一致。

内容的提问来源于stack exchange,提问作者m123416

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:03:13