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

为何NumPy SVD结果与R实现不一致?求技术排查建议

用NumPy通过SVD计算奇异矩阵伪逆的问题与解决方法

我之前在Stack Overflow上碰到一个关于奇异矩阵求逆的问题,想验证NumPy的SVD分解能不能给出可行解。刚好我之前在另一个Stack Overflow回答里用R实现过SVD求伪逆,就拿这个已知的正确结果来验证NumPy代码,结果发现两者输出不一致:

  • NumPy得到的U矩阵和R的形状相同,但所有元素符号完全相反
  • V矩阵的形状差异明显:NumPy输出是3×4,R的是4×3,且对应元素符号也有差异
  • 把NumPy手动计算的伪逆代入A*x=b方程,得到的结果和目标b向量存在误差;但R的解代入后完全符合预期
  • 不过用NumPy自带的np.linalg.pinv()方法得到的结果,和R的输出完全一致

检查代码后发现,手动计算伪逆的核心代码行存在错误:
原错误代码:

A_inv = np.matmul(np.matmul(np.transpose(V), D_zero), U)

修正后(将最后一个参数U改为转置后的np.transpose(U)):

A_inv = np.matmul(np.matmul(np.transpose(V), D_zero), np.transpose(U))

修正后重新运行,NumPy的结果和R以及np.linalg.pinv()的输出完全一致,代入A*x=b也能得到与目标b向量几乎无差的结果。

完整Python代码示例

import numpy as np

# 构造测试用奇异矩阵A
A = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12]])
# 目标向量b
b = np.array([10, 30, 50])

# NumPy SVD分解,注意返回的Vt是V的转置
U, S, Vt = np.linalg.svd(A, full_matrices=True)
V = Vt.T

# 构造伪逆的对角矩阵,过滤极小奇异值避免除以0
m, n = A.shape
D_zero = np.zeros((n, m))
for i in range(len(S)):
    if S[i] > 1e-10:
        D_zero[i, i] = 1 / S[i]

# 修正后的伪逆计算
A_inv = np.matmul(np.matmul(V, D_zero), U.T)

# 验证结果
x = A_inv @ b
print("计算得到的x向量:", x)
print("A@x的结果:", A @ x)
print("目标b向量:", b)

# 对比官方伪逆方法的结果
pinv_result = np.linalg.pinv(A)
print("\n手动计算与np.linalg.pinv的最大差异:", np.abs(pinv_result - A_inv).max())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:07:12