你有没有遇到过这样的尴尬?明明方程摆在那里,但系数矩阵偏偏是个“矮个子”或者“高个子”——不是方阵,或者虽然方方正正但行列式等于零,根本没有普通的逆矩阵。学生们急得直跺脚:“这题还怎么做?”别慌,伪逆矩阵就是那个专门收拾“烂摊子”的救火队员。它就像一支神奇的“万能钥匙”:即使原配钥匙丢了,它也能帮你把门打开——虽然不是完全精确的匹配,但已经是所有可能中最接近的方案了。本文要讲的伪逆矩阵,正是线性代数中专门应对这种“不可逆也能解方程”局面的利器。它不只是数学家抽屉里的理论玩具,更是数据拟合、机器学习回归、信号处理等 AI 领域中最常用的工具之一。 想象这样一个场景:你在一个陌生城市里迷路了,手里只有一张残缺不全的地图——有些街道被水渍弄模糊了,有些区块干脆没有绘制。你没法找到一条完全精确的路线,但你可以找到一条误差最小的路线,照样到达目的地附近。伪逆做的事情,就是这种“残缺信息下的最佳推算”。它用最小二乘的思想,找到最接近精确解的答案,并广泛应用于超定方程组(方程比未知数多)和欠定方程组(未知数比方程多)的求解。接下来,让我们一起揭开伪逆矩阵的神秘面纱。

岗位关联

作为 AI 从业者,无论是做数据拟合、线性回归,还是理解 Ridge 正则化背后的数学原理,伪逆矩阵都是你绕不开的核心工具。掌握它,你才能从容应对那些“没有标准答案”的工程问题,并为后续学习更复杂的优化算法打下坚实基础。

目录
  1. 可视化演示
  2. 伪逆的定义
  3. 摩尔彭若斯条件
  4. SVD求伪逆
  5. 超定方程组
  6. 欠定方程组
  7. 最小二乘关联
  8. 性质与应用
  9. 数值计算实现
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

通过SVD分解重构、最小二乘投影求解和超定/欠定系统对比,直观展示伪逆矩阵如何解决不可逆方程组的求解问题。

本节配有交互动效(进入视口后自动加载,约 3KB)。

SVD分解与伪逆计算 A = UΣV^T 分解为旋转-缩放-旋转 伪逆 A+ = VΣ+U^T 对Σ中非零奇异值取倒数 A+ = V Σ+ U^T 奇异值截断后伪逆提供数值稳定的广义解

伪逆的定义

还记得那张残缺的旧地图吗?当正常的地图(普通逆矩阵)不存在时,伪逆矩阵就是那幅“最佳替代路线图”。在数学世界里,并不是所有矩阵都有逆——矩阵必须是方阵且行列式不为零,才能找到它的“另一半”,让两者相乘得到单位矩阵。可现实问题往往不这么完美:你要拟合一条曲线,但有 100 个数据点、只有 3 个参数;你的传感器矩阵是长方形的,跟本没有方阵特征。这时候,我们需要一种更广义的“逆”。

伪逆矩阵(也称摩尔-彭若斯逆)就是对“逆”这个概念的一次大胆扩展。对于一个任意形状的矩阵 A(可以是长方形,也可以是奇异的方阵),伪逆 A⁺ 满足一个核心目标:当 Ax = b 无精确解时,A⁺b 给出误差最小的近似解。换句话说,普通逆追求“精确还原”,伪逆追求“最优逼近”——就像你用残破的地图导航,虽然没法精确到每一米,但你能走到离目的地最近的位置。

通过这个定义,任何矩阵都有了“逆”——哪怕它本身并不可逆。就像那张残缺的地图虽然不完美,但你总能规划出一条最合理的路线。伪逆因此成为线性代数工具箱里最常用的“万金油”,也是连接理论与工程的最佳桥梁。

A+=lim⁡α→0+(ATA+αI)−1AT\displaystyle A^+ = \lim_{\alpha \to 0^+} (A^T A + \alpha I)^{-1} A^T
这个极限表达式揭示了伪逆的本质:通过在 AᵀA 上添加微小的扰动 αI,让原本不可逆的矩阵变得可逆,然后取极限逼近精确值。α 就像一个“微调旋钮”,越小越接近真实的伪逆。
  1. 理解 AᵀA首先计算 A 的转置矩阵 Aᵀ,然后与 A 相乘得到 AᵀA,这是一个方阵,即使原本的 A 是长方形。
    ATA\displaystyle A^T A
  2. 添加扰动项在 AᵀA 的基础上加上 α 乘以单位矩阵 I,其中 α 是一个很小的正数。这个“微小扰动”让本来可能奇异(不可逆)的 AᵀA 变成可逆矩阵。
    ATA+αI\displaystyle A^T A + \alpha I
  3. 求逆操作对扰动后的矩阵求逆,再乘上 Aᵀ。这样得到的矩阵对于任意 α > 0 都有定义。
    (ATA+αI)−1AT\displaystyle (A^T A + \alpha I)^{-1} A^T
  4. 取极限令 α 趋向于 0⁺,这个表达式收敛到一个固定的矩阵,就是我们要求的伪逆 A⁺。可以理解为“扰动越来越小,结果越来越精确”。
    lim⁡α→0+\displaystyle \lim_{\alpha \to 0^+}

摩尔彭若斯条件

既然说伪逆是“最佳替代”,那什么样的替代才算“最佳”?数学家摩尔和彭若斯给出了四条铁律,称为摩尔-彭若斯条件(Moore-Penrose conditions)。这四条规律就像检验“真伪逆”的四道关卡——通过全部关卡,才能拿到“最佳替代”的合格证书。这就像招聘一个高级管家:不但要能把房间收拾好(第一条),自己也要保持整洁规范(第二条),还得清楚自己负责的区域界限(第三条和第四条)。

正式地,A⁺ 是 A 的伪逆,当且仅当以下四个条件同时成立。这四个条件不仅定义了伪逆,还保证了它的唯一性——就像一份独一无二的身份证号,任何矩阵的伪逆都只有一个,绝无二致。

摩尔-彭若斯条件让我们对伪逆有了绝对信心:不管你的矩阵多么“奇形怪状”,伪逆都客观存在且唯一。这就像那张残破地图,虽然街道信息不全,但“最优路线”是客观存在且唯一的——数学保证了这一点,我们只需要去找到它。

(1) AA+A=A(2) A+AA+=A+\text{(1)}\ AA^+A = A \qquad \text{(2)}\ A^+AA^+ = A^+
(3) (AA+)T=AA+(4) (A+A)T=A+A\text{(3)}\ (AA^+)^T = AA^+ \qquad \text{(4)}\ (A^+A)^T = A^+A
这四个条件分别对应:投影回来还是自己(条件 1)、投影的投影还是投影(条件 2)、矩阵与其转置相等即对称(条件 3 和 4)。它们共同保证了伪逆的唯一性和合理性。
  1. 条件 1回到原点:AA⁺A = A,意思是先经过 A⁺ 投影,再经过 A 变换,最终还是回到 A 的作用效果。这说明伪逆不是“乱操作”,它对 A 起到的是保留作用。
    AA+A=A\displaystyle AA^+A = A
  2. 条件 2投影幂等:A⁺AA⁺ = A⁺,说明 A⁺ 本身在 A 的投影下保持不变,也就是说 A⁺ 已经是“稳定状态”了。
    A+AA+=A+\displaystyle A^+AA^+ = A^+
  3. 条件 3对称性:(AA⁺)ᵀ = AA⁺,这个矩阵描述的是一个正交投影,它把向量投影到 A 的列空间上,且投影方向是垂直的。
    (AA+)T=AA+\displaystyle (AA^+)^T = AA^+
  4. 条件 4另一个对称性:(A⁺A)ᵀ = A⁺A,同理,这个矩阵描述的是把向量投影到 A 的行空间上的正交投影。
    (A+A)T=A+A\displaystyle (A^+A)^T = A^+A

SVD求伪逆

现在我们知道伪逆存在且唯一,但具体怎么算?最优雅、最通用的方法就是借助奇异值分解(SVD)。SVD 可以被理解为把任意矩阵 A 拆解成三个基本“积木块”的拼图:一个旋转(U)、一个拉伸(Σ)、又一个旋转(Vᵀ)。而伪逆的 SVD 公式堪称线性代数的“神来之笔”:只需要把拉伸量取倒数再转置重新拼回去,就得到伪逆了。

这就像修车一样:把汽车(矩阵 A)拆成零件(分解为 U、Σ、V),把磨损的齿轮(奇异值)翻新成新的(取倒数),再重新组装起来(得到 A⁺)。整个过程流畅清晰,而且适用于任何矩阵——不管它是不是方阵、是不是满秩。

其中 Σ 是对角阵(可能不是方阵),它的对角线上的元素是奇异值 σᵢ。Σ⁺ 则是把 Σ 中每个非零奇异值取倒数,非零奇异值的个数 r = rank(A)。

SVD 方法最大的魅力在于它的普适性:不需要判断矩阵是否可逆、是否满秩,统一套用这个流程即可。这也是为什么在 Python 的 numpy.linalg.pinv 内部,底层就是用 SVD 来计算伪逆的。就像一把万能瑞士军刀,开瓶器、螺丝刀、剪刀全都能搞定。

A=UΣVT⟹A+=VΣ+UT\displaystyle A = U \Sigma V^T \quad \Longrightarrow \quad A^+ = V \Sigma^+ U^T
  1. 奇异值分解对任意矩阵 A,先做 SVD,得到 A = UΣVᵀ。U 和 V 是正交矩阵(旋转),Σ 是对角矩阵(拉伸)。
    A=UΣVT\displaystyle A = U \Sigma V^T
  2. 定义 Σ⁺Σ⁺ 是把 Σ 转置后,再把对角线上的非零奇异值取倒数。换句话说,(Σ⁺)ᵢᵢ = 1/σᵢ(如果 σᵢ ≠ 0),否则为 0。
    Σii+={1/σiσi>00σi=0\displaystyle \Sigma_{ii}^+ = \begin{cases} 1/\sigma_i & \sigma_i > 0 \\ 0 & \sigma_i = 0 \end{cases}
  3. 伪逆的 SVD 形式将 U 和 V 的位置互换(因为转置的逆就是它本身),中间插入 Σ⁺,就得到 A⁺。
    A+=VΣ+UT\displaystyle A^+ = V \Sigma^+ U^T

超定方程组

现实中最常见的情况之一就是超定方程组——方程的数量比未知数的数量多。想象你在一个十字路口,有 3 个交通摄像头同时估算同一辆车的位置,每个摄像头都有一定误差。你不指望它们给出完全一致的答案,但你可以综合所有信息,得到误差最小的定位估计。这正是超定方程组和伪逆的工作方式。

数学上,超定方程组通常没有精确解。因为方程数太多,往往存在矛盾——没有一组 (x₁, x₂) 能同时满足所有方程。这时候求解 Ax = b 就变成寻找使误差最小的 x:minimize ‖Ax − b‖²,这正是最小二乘问题的核心思想。伪逆给出的 A⁺b 正是这个最小二乘解。

你看,伪逆在超定方程中不是“硬碰硬”地解方程,而是“软着陆”地找最优。这就像那个聪明的导航员:当地图信息互相矛盾时,他选的路线不是完全满足每一条信息,而是让整体偏差最小。数据拟合和回归分析中的大多数场景,本质上都是在解一个超定方程组——数据点比参数多得多,伪逆正是那把最称手的工具。

min⁡x ∥Ax−b∥2⟹x∗=A+b=(ATA)−1ATb(当 ATA 可逆)\displaystyle \min_{x}\ \|Ax - b\|^2 \quad \Longrightarrow \quad x^* = A^+ b = (A^T A)^{-1} A^T b \quad (\text{当 } A^T A \text{ 可逆})
当 A 列满秩时,AᵀA 可逆,伪逆退化为 (AᵀA)⁻¹Aᵀ,这就是经典的最小二乘公式,用一句大白话来说就是“在误差平方和最小的意义下找最优解”。
  1. 定义残差残差 r = Ax − b,表示预测值与真实值之间的差距。我们希望这个差距向量尽可能短。
    r=Ax−b\displaystyle r = Ax - b
  2. 目标函数最小化残差的平方和,即目标函数 J = rᵀr = ‖Ax − b‖²。
    J(x)=∥Ax−b∥2\displaystyle J(x) = \|Ax - b\|^2
  3. 求导为零对 J 关于 x 求导并令导数为零(极值条件),可推导出正规方程。
    ∇xJ=2AT(Ax−b)=0\displaystyle \nabla_x J = 2A^T(Ax - b) = 0
  4. 求解正规方程由 AᵀAx = Aᵀb,当 AᵀA 可逆时,得到 x* = (AᵀA)⁻¹Aᵀb,这就是伪逆解。
    x∗=(ATA)−1ATb\displaystyle x^* = (A^T A)^{-1} A^T b

欠定方程组

与超定方程组相反,欠定方程组是未知数比方程多。这种情况在科学和工程中也屡见不鲜:比如你只有 2 个测量数据,却想还原一个 3 维向量。这时候方程不够用了,解有无数多个——就像你只知道一个点在某个平面上,却没法确定它在平面上的确切位置。但伪逆能帮你做出选择:在所有可能的解中,挑选范数(向量长度)最小的那一个。

欠定方程组 Ax = b 的解一般构成一个仿射子空间:x = x₀ + null(A) 中的任意向量。伪逆选择的解 x⁺ = A⁺b 是这个集合中模长最小的,即 x⁺ 垂直于零空间。这好比一根长绳被钉在两面墙之间(对应约束方程),你拉直它时它处于最省力的状态——那是最短的物理状态,就是伪逆选择的解。

欠定场景在机器学习特征选择、信号压缩感知等领域非常重要:当特征数远超样本数时,解空间巨大,伪逆帮助我们选出一个表达最简单(范数最小)的答案。这正像一位经验丰富的侦探:面对一堆线索和多个可能的真相,他选择那个最简洁、最省力的解释——奥卡姆剃刀原则。

x∗=A+b=arg⁡min⁡x {∥x∥  :  Ax=b}\displaystyle x^* = A^+ b = \arg\min_{x}\ \{\|x\| \;:\; Ax = b\}
欠定问题时,伪逆从无穷多解中挑选“最短”的那一个。换句话说,在满足约束的所有路线里,它选了一条最近的路。
  1. 解的集合Ax = b 的解可以写成 x = x₀ + z,其中 x₀ 是特解,z 属于 A 的零空间 null(A)。
    x=x0+z,z∈null⁡(A)\displaystyle x = x_0 + z, \quad z \in \operatorname{null}(A)
  2. 范数最小化在这些解里找一个模长最小的,即 minimize ‖x‖²。
    min⁡x ∥x∥2s.t.Ax=b\displaystyle \min_{x}\ \|x\|^2 \quad \text{s.t.} \quad Ax = b
  3. 伪逆解利用拉格朗日乘子法或几何投影,得到最优解是 x⁺ = A⁺b,并且它与零空间正交。
    x+=A+b,x+⊥null⁡(A)\displaystyle x^+ = A^+ b, \quad x^+ \perp \operatorname{null}(A)

最小二乘关联

伪逆和最小二乘像是硬币的两面:伪逆是为了解最小二乘问题而生的最佳工具,最小二乘则是伪逆最自然的注解。回到我们的地图比喻:残缺地图上你要找到“离目的地最近”的路线,这个“最近”的度量,就是最小二乘的平方距离。伪逆解出来的 x⁺,恰好是让残差平方和最小的那个点。

两者之间的纽带正是正规方程(normal equations)。当我们考虑目标函数 ‖Ax − b‖²,对它求梯度并令其为零,就会导出:

当 AᵀA 可逆时,最小二乘解就是伪逆解;当 AᵀA 不可逆时(例如矩阵缺乏列满秩),伪逆变身为那把更稳的钥匙,用 SVD 的方式照常给出最小二乘意义下的解。

伪逆不仅统一了最小二乘的所有情形(满秩、不满秩、超定、欠定),还提供了统一的计算路径。这就好比你的导航工具不仅有精确的街道图,还可以在没有 MAP 的时候用 GPS 定位拼出一张最接近实际的地图。从工程的角度看,伪逆让我们可以在各种“坏条件”下稳定地求解最小二乘问题,这也是它在机器学习和数据分析中被广泛使用的原因。

ATAx=ATb⟹xls=(ATA)−1ATb\displaystyle A^T A x = A^T b \quad \Longrightarrow \quad x_{\text{ls}} = (A^T A)^{-1} A^T b
  1. 写目标函数最小二乘目标函数为残差的二范数平方:J(x) = ‖Ax − b‖² = (Ax − b)ᵀ(Ax − b)。
    J(x)=(Ax−b)T(Ax−b)\displaystyle J(x) = (Ax - b)^T (Ax - b)
  2. 展开表达式展开得到 J(x) = xᵀAᵀAx − 2bᵀAx + bᵀb。
    J(x)=xTATAx−2bTAx+bTb\displaystyle J(x) = x^TA^TAx - 2b^TAx + b^Tb
  3. 梯度为零对 x 求导并令结果为零:∇J = 2AᵀAx − 2Aᵀb = 0。
    2ATAx−2ATb=0\displaystyle 2A^TAx - 2A^Tb = 0
  4. 解出最小二乘解化简后得 AᵀAx = Aᵀb,故 x_ls = A⁺b。
    xls=A+b\displaystyle x_{\text{ls}} = A^+ b

性质与应用

伪逆不只是定义漂亮,它还有一堆实用的好性质。就像一位全能选手,无论球类、田径还是游泳,样样都有出色表现。掌握这些性质,你就能在任何场景中自如使用伪逆。以下几条是最常用的:

首先,伪逆是对普通逆的自然扩展:若 A 可逆,则 A⁺ = A⁻¹。其次,(A⁺)⁺ = A,伪逆的伪逆回到自己,就像倒带一样。此外,伪逆满足 (Aᵀ)⁺ = (A⁺)ᵀ。如果 A 是列满秩,A⁺ = (AᵀA)⁻¹Aᵀ;如果行满秩,A⁺ = Aᵀ(AAᵀ)⁻¹。这些性质让伪逆在不同场景下都能灵活变形。

在 AI 应用中,伪逆最核心的舞台包括:线性回归(用最小二乘拟合数据),Ridge 回归(正则化后仍然可以用伪逆解析解),以及处理病态问题(当 AᵀA 接近奇异时,用 SVD 截断的伪逆来稳定结果)。

这个式子看起来和伪逆的极限定义类似——正则化就是给特征矩阵加一个“微小扰动” λI,从而保证可逆性,这与伪逆的极限定义异曲同工。可以毫不夸张地说,理解伪逆是理解正则化的数学直觉之门。

无论是 AI 工程师跑线性模型,还是数据科学家做特征分析,甚至研究员理解正则化方法,伪逆都是那个默默在背后支撑的核心工具。就像 GPS 导航仪中的底层算法,虽然用户看不到,但每一步决策都离不开它。

βridge=(XTX+λI)−1XTy\displaystyle \beta_{\text{ridge}} = (X^T X + \lambda I)^{-1} X^T y
  1. 看线性回归线性回归问题中,预测目标 y 关于特征 X 的关系是 y = Xβ + ε,任务是最小化 ‖Xβ − y‖²。
    min⁡β∥Xβ−y∥2\displaystyle \min_{\beta} \|X\beta - y\|^2
  2. 伪逆解最优参数 β* = X⁺y。这是伪逆最直接的应用。
    β∗=X+y\displaystyle \beta^* = X^+ y
  3. Ridge 正则化在目标函数里加入惩罚项 λ‖β‖²,防止过拟合。其解析解为 (XᵀX + λI)⁻¹Xᵀy。
    βridge=(XTX+λI)−1XTy\displaystyle \beta_{\text{ridge}} = (X^TX + \lambda I)^{-1}X^Ty
  4. 联系伪逆这个公式实际上就是伪逆极限定义在 α = λ 时的近似——只要 λ 不太大,β_ridge 就和伪逆解 X⁺y 很接近。
    X+=lim⁡λ→0+(XTX+λI)−1XT\displaystyle X^+ = \lim_{\lambda \to 0^+} (X^TX + \lambda I)^{-1}X^T

数值计算实现

理论讲完了,实际操作才是关键。在 Python 中,我们不需要自己写 SVD,只需要调用 numpy.linalg.pinv 一行代码,就能求解任何矩阵的伪逆。但理解其内部原理仍然非常重要——特别是在处理病态矩阵、噪声敏感任务时,你需要知道什么时候用截断的伪逆(truncated SVD)来稳定结果。

数值上计算伪逆时,常遇到的问题是:很小的奇异值 σᵢ 取倒数后会很大,导致数值爆炸。就像地图上一个微小的测量误差被沿途放大,最后让你的路线完全偏离。解决办法就是设置一个截断阈值(rtol):当 σᵢ 小于阈值时,直接视为 0,不取倒数。这相当于自动忽略那些“噪声方向”,使解更稳定。

数值计算的稳定性是工程实战的生命线。就像你给朋友指路时不会刻意介绍那些犄角旮旯的小路(等价于忽略小奇异值),而是选择大路(大奇异值)来保证方向不出错。掌握这些数值技巧,你就能在真实数据中遨游而无惧噪声。

Σii+={1/σi,σi>rtol⋅σmax⁡0,otherwise\displaystyle \Sigma_{ii}^+ = \begin{cases} 1/\sigma_i, & \sigma_i > \text{rtol} \cdot \sigma_{\max} \\ 0, & \text{otherwise} \end{cases}
这条截断准则告诉我们:奇异值太小,就当作不存在。这样大大提高了伪逆在数值上的稳定性,是工程中常用的技巧。
  1. 找出奇异值对 A 做 SVD,得到奇异值 σ₁ ≥ σ₂ ≥ … ≥ σᵣ。
    σ1≥σ2≥⋯≥σr>0\displaystyle \sigma_1 \ge \sigma_2 \ge \dots \ge \sigma_r > 0
  2. 设定阈值设定 rtol × σ_max,rtol 通常取一个很小的数,如 1e-10 或 1e-12。
    τ=rtol×σmax⁡\displaystyle \tau = \text{rtol} \times \sigma_{\max}
  3. 截断操作只对 σᵢ > τ 的那些方向取倒数 1/σᵢ,其余置为 0,得到 Σ⁺。
    σi+={1/σiσi>τ0σi≤τ\displaystyle \sigma_i^+ = \begin{cases} 1/\sigma_i & \sigma_i > \tau \\ 0 & \sigma_i \le \tau \end{cases}
  4. 组装伪逆最后用 A⁺ = VΣ⁺Uᵀ 拼装出完整的伪逆矩阵。
    A+=VΣ+UT\displaystyle A^+ = V \Sigma^+ U^T

AI 应用场景

场景一:数据科学中的线性回归求解

阶段:模型训练与参数估计

解决的问题:传统的线性回归需要求 XᵀX 的逆矩阵,但当特征高度相关(多重共线性)或样本量小于特征数时,XᵀX 不可逆或接近奇异,普通方法直接崩溃。伪逆通过 SVD 分解,即使 XᵀX 不满秩,也能稳定输出最小二乘解。

具体案例:某电商平台做用户购买力预测,有 800 个特征但只有 200 个完整样本。数据科学家使用 np.linalg.pinv(X) @ y 来计算回归系数,得到的模型在验证集上表现稳定,没有被共线性导致的过拟合带偏。相比手写正规方程报错 "Singular matrix",伪逆方案一气呵成。

场景二:机器人运动学中的逆运动学求解

阶段:机器人控制与规划

解决的问题:机械臂的逆运动学问题经常遇到雅可比矩阵不可逆的情况(机械臂处于奇异位形时),传统求逆失败,导致控制信号无法计算。伪逆提供了一种最小范数解,能够在奇异位形附近依然给出合理的控制指令。

具体案例:某工厂六轴机械臂在流水线抓取任务中,当机械臂接近工作空间边界时雅可比矩阵发生奇异。工程师改用伪逆计算关节速度,结合阻尼最小二乘(DLS)方法,平滑地完成了边界区域的精细操作,避免了系统抖动和停机。

场景三:推荐系统中的矩阵补全

阶段:数据预处理与特征工程

解决的问题:用户-物品评分矩阵往往高度稀疏且非方阵,使用伪逆可以在“欠定”的条件下找到范数最小的低秩近似,帮助理解潜在的用户偏好结构,为后续协同过滤算法提供干净的输入。

具体案例:某视频平台想要对用户未观看的视频做评分预测,评分矩阵 10000 行 × 5000 列但只有 1.2% 非空值。数据团队先对评分矩阵做了 SVD 并使用截断伪逆重构低秩近似,将稀疏矩阵转化为密集的低维表征,再送入神经网络推荐模型,推荐的命中率提升了 18%。

Python 演示

python45 行
import numpy as np def solve_with_pinv(A, b, rtol=1e-10):    """使用 SVD 截断方法求解伪逆    A: 系数矩阵(任意形状)    b: 目标向量    rtol: 截断奇异值的相对阈值    """    U, s, Vt = np.linalg.svd(A, full_matrices=False)    # 计算截断阈值    tau = rtol * s.max()    # 对非零奇异值取倒数,其余归零    s_inv = np.array([1/si if si > tau else 0 for si in s])    # 拼回伪逆矩阵: A+ = V DIAG(s_inv) U^T    A_pinv = (Vt.T * s_inv) @ U.T    # x* = A+ @ b    x = A_pinv @ b    return x, A_pinv if __name__ == "__main__":    # 示例1: 超定方程组 (5个方程 2个未知数)    A1 = np.random.randn(5, 2)    b1 = np.random.randn(5)    x1, Ap1 = solve_with_pinv(A1, b1)    print("超定方程组示例:")    print("解 x1 =", x1)    print("残差范数 =", np.linalg.norm(A1 @ x1 - b1))    print()     # 示例2: 欠定方程组 (2个方程 3个未知数)    A2 = np.random.randn(2, 3)    b2 = np.random.randn(2)    x2, Ap2 = solve_with_pinv(A2, b2)    print("欠定方程组示例:")    print("解 x2 =", x2)    print("解的范数 =", np.linalg.norm(x2))    # 验证是否满足方程    print("残差 =", np.linalg.norm(A2 @ x2 - b2))    print()     # 与 numpy.linalg.pinv 对比    Ap_np = np.linalg.pinv(A1)    x_np = np.linalg.pinv(A1) @ b1    print("与 numpy.linalg.pinv 一致:",          np.allclose(Ap1, Ap_np), np.allclose(x1, x_np))
目的:这段代码手动实现了基于 SVD 截断的伪逆计算方法,展示了在超定方程组和欠定方程组中,伪逆如何给出最小二乘解或最小范数解,同时与 NumPy 内置的 np.linalg.pinv 结果进行对比验证。
  1. U, s, Vt = np.linalg.svd(A, full_matrices=False)对矩阵 A 做奇异值分解,得到左奇异向量 U、奇异值数组 s、右奇异向量 Vt。
  2. tau = rtol * s.max()根据最大奇异值设定截断阈值,忽略那些干扰计算的小奇异值。
  3. s_inv = np.array([1/si if si > tau else 0 for si in s])对超过阈值的奇异值取倒数,小于阈值的置零,防止数值爆炸。
  4. A_pinv = (Vt.T * s_inv) @ U.T按公式 A⁺ = VΣ⁺Uᵀ 重新组装伪逆矩阵。
  5. x = A_pinv @ b用伪逆左乘 b 得到方程的最优逼近解。
  6. np.allclose(Ap1, Ap_np)验证手动实现的伪逆与 NumPy 官方结果完全一致。

常见误区

误区伪逆嘛,不就是矩阵求逆的替代品吗?反正都是 Ax = b 的解,直接用不会出问题。

正解伪逆和普通逆有本质区别。普通逆追求精确还原,要求矩阵必须是方阵且行列式不为零;伪逆追求最优逼近,适用于任意矩阵。当 A 可逆时,A⁺ = A⁻¹,伪逆退化为普通逆;但当 A 不可逆或长方形时,伪逆解不是精确解,而是最小二乘意义下的最佳逼近,并且欠定情况下取的是最小范数解。用“平替”来描述会低估它在复杂问题中的独特价值。

为何常见:因为初学者接触第一个“逆”就是普通逆,遇到伪逆时很容易用“旧概念的扩展”来套用,没意识到整个求解的目标函数已经变了。

误区一个矩阵的伪逆只有一个吗?那只要找到任何一个满足 Ax = b 的解,就等价于伪逆解吧?

正解伪逆确实唯一,但“任何一个解”并不等价于伪逆解。伪逆解同时具备两个关键性质:它让残差范数 ‖Ax − b‖ 最小,并且在所有残差最小化的解中,它的范数也是最小的。普通解可能误差很大,或者虽然误差小但范数巨大(在欠定问题中)。例如欠定方程组有无穷多解,但只有伪逆解是最短的那一个。

为何常见:初学者往往只记住了“伪逆唯一存在”这句话,却忽略了它是在“最佳逼近”和“最短范数”的双重约束下定义的,没有把两个优化目标并列看待。

误区伪逆用 SVD 算,但是 SVD 太慢了而且不稳定,不如直接用正规方程求逆来得快。

正解正规方程 (AᵀA)x = Aᵀb 在矩阵病态时反而更不稳定,因为 AᵀA 会把条件数平方放大。SVD 是数值上最稳定的矩阵分解方法之一,配合截断策略可以进一步抑制噪声。虽然 SVD 的计算成本高于正规方程,但在工程实践中,稳定性往往比速度更重要。很多生产环境都默认用 np.linalg.pinv(基于 SVD)而不是手动求解正规方程。

为何常见:因为学生先学了正规方程的简单公式,再看到 SVD 的“复杂流程”就觉得它效率低、不稳定,实际上是对数值线性代数中“条件数”和“稳定性”概念不够熟悉。

误区伪逆是纯理论的东西,我写 AI 代码从来都用不到,不学也罢。

正解伪逆在 AI 工程中无处不在。np.linalg.pinv 在 sklearn 的 LinearRegression 底层被使用,Ridge 回归的解析解与伪逆的极限定义一脉相承,PCA、特征脸、协同过滤中的 SVD 操作都和伪逆紧密相关。即使是深度学习中的优化器,Adam 中对梯度二阶矩的修正也与“防止奇异”的思想相通。伪逆是理解这些工具的共同数学底座。

为何常见:因为初学时太注重公式推导而忽略了实际代码库的调用,不知道 sklearn.linear_model.LinearRegression 内部就是用了 scipy.linalg.pinv。

面试题

Q1. 关于伪逆矩阵的说法,下列哪一项是正确的?

单选题 · easy

  • A.伪逆只对不可逆的方阵有定义
  • B.伪逆是普通逆的自然扩展,适用于任意矩阵← 正确答案
  • C.伪逆一定不等于普通逆
  • D.伪逆只能用 SVD 计算,没有其他方法

答案:B。伪逆对任意形状的矩阵都有定义,因此 B 正确。A 错误,非方阵(长方形矩阵)也有伪逆。C 错误,当矩阵可逆时伪逆等于普通逆。D 错误,虽然 SVD 是最常用方法,但定义中还有极限形式和正规方程形式等。

Q2. 摩尔-彭若斯条件包括哪些?(多选)

多选题 · mid

  • A.AA⁺A = A← 正确答案
  • B.A⁺AA⁺ = A⁺← 正确答案
  • C.(AA⁺)ᵀ = AA⁺← 正确答案
  • D.A⁺ = A⁻¹

答案:ABC。摩尔-彭若斯条件的四条公理包括 AA⁺A = A、A⁺AA⁺ = A⁺、(AA⁺)ᵀ = AA⁺ 和 (A⁺A)ᵀ = A⁺A。选项 D 是普通逆的性质,只有当矩阵可逆时伪逆才退化为普通逆,不属于摩尔-彭若斯条件本身。

Q3. 对于任意矩阵 A,A⁺ 的最通用计算路径是什么?

单选题 · easy

  • A.直接计算 (AᵀA)⁻¹Aᵀ
  • B.基于奇异值分解(SVD)计算← 正确答案
  • C.手动做增广矩阵初等变换
  • D.高斯消元法

答案:B。SVD 是计算伪逆的通用方法,适用于各种形状和秩的矩阵,因此 B 正确。A 只有在 AᵀA 可逆(列满秩)时才成立。C 和 D 主要用于方阵求普通逆,对长方形矩阵不适用。

Q4. 超定方程组的最小二乘解等价于:

单选题 · mid

  • A.A⁻¹b
  • B.A⁺b← 正确答案
  • C.bA⁺
  • D.Aᵀb

答案:B。超定方程组求解本质是 minimize ‖Ax − b‖²,其解就是伪逆解 x* = A⁺b,故 B 正确。A 只有在 A 可逆时才有意义,超定矩阵不是方阵,没有普通逆。C 是矩阵与向量的乘法顺序错误。D 只是计算过程中的一个步骤,不是最终解。

Q5. 在欠定方程组 Ax = b 中,伪逆解 x⁺ 的特点是什么?

单选题 · mid

  • A.它是唯一满足方程的解
  • B.它是范数最大的一个解
  • C.它是所有满足方程的解中范数最小的← 正确答案
  • D.它不满足原方程

答案:C。欠定方程组有无穷多解,伪逆解在所有解中具有最小范数:x⁺ ⊥ null(A)。所以 C 正确。A 错误,因为欠定解不唯一。B 正好说反了。D 错误,伪逆解一定满足 Ax = b。

Q6. 关于伪逆和最小二乘的关系,下列说法正确的是?(多选)

多选题 · hard

  • A.最小二乘解 x_ls 等于 A⁺b,当 AᵀA 可逆时就是 (AᵀA)⁻¹Aᵀb← 正确答案
  • B.伪逆解一定精确满足 Ax = b
  • C.当 AᵀA 不可逆时,伪逆依然可以给出最小二乘解← 正确答案
  • D.伪逆只适用于无解的超定方程组

答案:AC。最小二乘解与伪逆解是一致的,A 正确。伪逆解在超定情形下不精确满足 Ax = b,而是让残差范数最小,所以 B 错误。伪逆通过 SVD 即使在 AᵀA 不可逆时也能求出最小二乘解,所以 C 正确。伪逆变适用于超定、欠定以及方阵奇异等多种情形,不仅仅是超定方程组,D 错误。

Q7. 为什么伪逆计算中常常使用奇异值截断(truncated SVD)?

单选题 · mid

  • A.为了让结果更精确
  • B.为了避免小奇异值取倒数带来的数值不稳定← 正确答案
  • C.为了减少计算时间
  • D.为了让矩阵更方阵

答案:B。截断的核心原因是数值稳定性,B 正确。太小的奇异值 σᵢ 取倒数后会变得极大,放大噪声和误差。截断后把微小奇异值当作 0 忽略,相当于滤除噪声方向。A 说反了——截断不是为更精确,而是为更稳健。C 是附带好处但不是主要原因。D 截断不改变矩阵形状。

Q8. 设 A 是某机器学习问题中的特征矩阵,形状为 (m, n) 且 m < n(样本数少于特征数),下列说法正确的是?(多选)

多选题 · hard

  • A.AᵀA 一定可逆
  • B.线性回归问题存在无穷多组精确解← 正确答案
  • C.伪逆解 X⁺y 是所有精确解中范数最小的← 正确答案
  • D.使用伪逆算出的解没有任何实际意义

答案:BC。当 m < n 时矩阵列不满秩,AᵀA 一定不可逆,故 A 错误。欠定方程组解有无穷多个,B 正确。伪逆解从无穷多解中挑选范数最小的那个,符合奥卡姆剃刀原则,C 正确。伪逆解在特征选择、稀疏建模中有重要应用价值,D 错误。

Q9. 若 A 是满秩方阵,则伪逆 A⁺ 等于:

单选题 · easy

  • A.零矩阵
  • B.A⁻¹← 正确答案
  • C.Aᵀ
  • D.2A⁻¹

答案:B。当 A 可逆时,伪逆退化为普通逆,即 A⁺ = A⁻¹,故 B 正确。A 显然是错的,零矩阵无法作为逆。C 是转置不是逆。D 乘以系数 2 更没有任何依据。

Q10. 关于 Ridge 回归 β = (XᵀX + λI)⁻¹Xᵀy 与伪逆的关系,描述正确的是:

单选题 · hard

  • A.两者完全无关
  • B.Ridge 的解析本质上是伪逆定义的极限形式取 λ → 0⁺← 正确答案
  • C.Ridge 解在 λ 趋近于零时与最小二乘解完全相反
  • D.Ridge 不具备任何数值稳定性

答案:B。伪逆的定义正是 $\lim_{\alpha \to 0^+} (A^TA + \alpha I)^{-1}A^T$,Ridge 中的 (XᵀX + λI)⁻¹Xᵀy 恰好是伪逆在 α = λ 时的近似,B 正确。A 错误,两者同源。C 说反了,λ → 0 时 Ridge 解趋近于最小二乘解。D 错误,Ridge 正是为了提高数值稳定性而引入 λI 项的。