矩阵极分解实现疑问: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计算结果与教程的差异完全是特征值/特征向量的表现形式差异,而非计算错误,具体原因如下:
特征值顺序不同:
Numpy的linalg.eig函数返回的特征值没有固定的排序规则(并非严格按大小升序/降序),但返回的特征值集合与教程完全一致(都是25、225、2025),只是排列顺序不同。特征向量的形式差异:
- 归一化处理:教程中使用的是未归一化的整数特征向量,而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返回的是**单位化(长度为1)**的特征向量,二者成比例(比如教程中对应特征值225的特征向量是
只要基于Numpy的结果正确构造特征值对角矩阵(按特征向量的对应顺序),并计算$P = V \sqrt{\Lambda} VT$(由于$AT A$是对称矩阵,特征向量矩阵$V$正交,其逆等于转置),最终得到的P和U会与Scipy的结果完全一致。
内容的提问来源于stack exchange,提问作者m123416
相关产品推荐
相关产品推荐

