如何通过SVD在Python中求解矩阵的广义逆A+?
使用SVD求解Moore-Penrose广义逆的正确实现
你的SVD分解代码是正确的,U4@D4@V4能还原原矩阵,说明分解逻辑没问题。问题可能出在对广义逆性质的误解,或是手动构造伪逆矩阵时的冗余操作。
正确的广义逆推导
对于矩阵A的SVD分解:$A = U\Sigma V$(对应你的代码中A4 = U4 @ D4 @ V4),Moore-Penrose广义逆$A^+$的公式为:
$A^+ = V^T \Sigma^+ U^T$
其中$\Sigma^+$是$\Sigma$的伪逆:
- 形状为$n \times m$(A是$m \times n$)
- 将$\Sigma$中的非零奇异值取倒数,其余位置保持0
修正后的代码
手动构造D4p的逻辑是对的,但可以用更简洁且不易出错的方式生成:
import numpy as np import scipy as sp # 定义原矩阵 A4 = np.array([[3, 1,2,3,4], [5,2,3,4,5], [7,4,5,6,7]]) # 执行SVD分解 U4, s4, V4 = np.linalg.svd(A4) D4 = sp.linalg.diagsvd(s4, 3, 5) # 构造Σ的伪逆Σ⁺ D4p = np.zeros((5, 3)) # 将非零奇异值的倒数填充到对角位置 np.fill_diagonal(D4p, 1/s4) # 计算广义逆A⁺ A4plus = V4.T @ D4p @ U4.T # 验证广义逆性质 print("A⁺A(5×5正交投影矩阵):") print(np.round(A4plus @ A4, 2)) print("\nAA⁺(3×3单位矩阵,因A行满秩):") print(np.round(A4 @ A4plus, 2))
关键说明
广义逆的性质:
- 当A是行满秩(你的3×5矩阵秩为3),$AA^+$是$m \times m$的单位矩阵,这是正常结果。
- $A^+A$是$n \times n$的正交投影矩阵(不是单位矩阵),它负责将向量投影到A的列空间,这是行满秩矩阵广义逆的固有特性,并非代码错误。
正确性验证:
可以用numpy内置伪逆函数对比结果,确认实现无误:A4plus_np = np.linalg.pinv(A4) print("\n与numpy内置伪逆的最大误差:") print(np.max(np.abs(A4plus - A4plus_np))) # 误差应接近1e-15量级
内容的提问来源于stack exchange,提问作者Ginto
相关产品推荐
相关产品推荐

