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

为何numpy中AA.T的伪逆范数会激增?有无更稳定计算方式?

为什么pinv(AA.T)的范数会激增?如何用更稳定的方式计算?

问题原因分析

你的代码中,AA是严格秩1的矩阵(所有行都是[0.1, 0.1]),理论上pinv(AA)和pinv(AA.T)的范数应该完全相等,且随着规模nn增大而单调减小——因为伪逆的范数与矩阵的最小非零奇异值成反比,而AA的非零奇异值随nn增大而增大。

但如果出现范数激增的现象,通常是以下原因导致:

  • 数值扰动:实际计算中,浮点数精度限制或数据中的微小噪声会让矩阵从严格秩1变成接近秩亏的矩阵(比如存在一个极小的非零奇异值)。此时伪逆的范数会因这个极小奇异值的倒数而急剧增大。
  • 场景偏差:如果你的实际场景中AA并非严格秩1(比如行向量存在微小差异),随着nn增大,矩阵的秩亏程度会被放大,最小奇异值趋近于0,直接导致伪逆范数激增。

数值稳定性更高的计算方式

1. 调整伪逆的奇异值阈值

np.linalg.pinv支持通过rcond参数设置奇异值的阈值,忽略小于rcond * max_singular_value的奇异值,避免因极小奇异值导致的范数爆炸:

# 手动指定合理的rcond,过滤微小奇异值
pinv_AAT = np.linalg.pinv(AA.T, rcond=1e-6)

rcond的取值需要根据数据精度调整,通常在1e-10到1e-6之间。

2. 手动基于SVD分解计算伪逆

直接使用SVD分解,手动控制奇异值的截断,比默认的pinv更灵活:

U, S, Vh = np.linalg.svd(AA.T, full_matrices=False)
# 截断过小的奇异值
threshold = 1e-6
S_inv = np.where(S > threshold, 1/S, 0)
pinv_AAT = Vh.T @ np.diag(S_inv) @ U.T

这种方式可以精准控制哪些奇异值被保留,完全避免极小奇异值的影响。

3. 利用矩阵结构直接推导伪逆

如果矩阵具有特殊结构(比如秩1),可以直接用代数公式推导伪逆,跳过数值计算的误差:
对于秩1矩阵A = u @ v.T,伪逆的公式为:

u = AA.T[:, 0].reshape(-1, 1)  # 取AA.T的列向量作为u
v = np.ones((nn, 1))           # 对应行向量全1
u_norm_sq = np.sum(u**2)
v_norm_sq = np.sum(v**2)
pinv_AAT = (v @ u.T) / (u_norm_sq * v_norm_sq)

这种方法完全基于代数推导,没有数值分解的误差,稳定性最高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:54:51