对伪逆的几何理解: 嵌入, 投影与坐标变换

这篇文章1是“对矢量基变换与坐标变换的一致理解”的后续. 写作缘由是前一段时间写机械臂IK, 自学数学理论的时候遇到一些问题, 向Gemini请教讨论得到了不错的理解. 本文采用和前序文章一致的启发式思路, 对非数理专业的工科背景读者友好.


前言

方程比未知数多时, 为什么常常无解? 这其实不难理解: 多出来的约束也可能和前面的要求发生冲突. 不过我要写的理解方式比较偏向几何直观.

我们先从这个熟悉的问题出发, 用低维嵌入高维的图像理解它, 再考虑怎样投影, 降噪, 估计原来的输入. 接着把方向反过来, 看看高维压缩成低维以后, 怎样挑一个合适的高维输入.

沿着这条思路, 转置矩阵 $A^{\mathsf T}$ 为什么会出现在伪逆里, 以及为什么会有左右伪逆的区别, 就可以一步步接起来.

记号沿用前文“对矢量基变换与坐标变换的一致理解”: 粗体 $\boldsymbol{x}$ 表示矢量, $\vec x$ 表示它在某组基下的坐标. 矩阵乘法中的数组都按坐标理解, 左边的矩阵依次作用于这些坐标; 例如 $B(A\vec x)$, 就是先经过 $A$, 再经过 $B$. 以下默认使用实数和标准正交的自然基.

1. 超定方程与高维嵌入

先看一个 $3\times2$ 的矩阵:

$$ A=\begin{bmatrix} 1&0\\ 0&1\\ 1&1 \end{bmatrix}, \qquad A\begin{bmatrix} x_1 \\ x_2 \end{bmatrix} =\begin{bmatrix} x_1 \\ x_2 \\ x_1+x_2 \end{bmatrix}. $$

输入只有两个坐标, 输出却有三个. 不过第三个坐标已经被前两个决定了: 它们始终满足 $y_3=y_1+y_2$. 所以输出虽然写在三维空间里, 实际活动范围是一张穿过原点的二维平面.

这就是把二维嵌入三维. 可以想象把一张画有坐标网格的纸斜放进房间里: 纸上的点用房间的坐标来写, 需要三个数字; 但沿纸面移动, 仍然只有两个独立方向.

推广到一个 $m\times n$ 矩阵, $m>n$, 它有 $n$ 列, 呈瘦高状. 若这些列线性无关, 就称为列满秩. 它们在高维空间中张成一个 $n$ 维线性子空间, 称为 $A$ 的列空间, 记作 $\mathcal C(A)$. 它就是刚才的二维平面向更高维情形的推广, 后文统一称为嵌入子空间.

当 $n=m-1$ 时, 这个子空间称为超平面: 例如三维中的二维平面, 四维中的三维子空间. 这里的“平面”可以有更高维度. 二维嵌入四维时, 维数相差 $2$, 我们就直接称它为二维子空间.

现在求 $A\vec x=\vec b$, 就是给定一个高维结果 $\vec b$, 想找出产生它的输入 $\vec x$.

困难在于, 随便给一个三维测量点, 它可能飘在平面上方. 而我们的矩阵无论接收什么输入, 输出都在平面上. 例如

$$ \vec b=\begin{bmatrix}3\\ 4\\ 4\end{bmatrix}. $$

这三个数字要求同时满足 $x_1=3$, $x_2=4$, $x_1+x_2=4$. 三个要求放在一起发生了冲突. 这就是超定方程的直观含义: 未知数只有两个, 测量给出了三个约束, 数据出现误差时, 约束之间就可能对不上.

那么自然的目标是: 先把测量点垂直投到平面上, 找一个离它最近, 而且确实能由 $A$ 产生的结果, 再求对应的输入.

为什么选择垂直投影? 从测量点到平面的垂线最短. 若在垂足之外再沿平面走一段 $\vec d$, 由勾股定理, 距离平方会多出 $|\vec d|^2$. 所以我们要找的就是这个垂足.

用公式写, 目标是

$$ \min_{\vec x}|A\vec x-\vec b|^2. $$

范数在这里就是距离. 距离平方等于各个坐标误差的平方和, 因此这叫作最小二乘.

2. $A^{\mathsf T}$ 为什么能降噪

目标已经清楚了: 保留子空间里的信息, 消去垂直于子空间的偏离. 先从这个目标出发, 我们需要怎样的映射?

设这个映射为 $M$. 测量点可以分成子空间中的部分 $\vec p$ 和垂直偏差 $\vec e$, 即 $\vec b=\vec p+\vec e$. 我们希望 $M\vec e=\vec0$, 这样 $M\vec b=M\vec p$; 同时, 子空间中不同的点应当仍有不同的输出, 方便后续恢复输入.

一个映射把哪些输入变成零, 这些输入组成的空间就叫它的零空间, 记作 $\ker M$. 而所有垂直于子空间的方向, 组成子空间的正交补, 记作 $\mathcal C(A)^\perp$. 所以刚才的要求可以集中写成

$$ \ker M=\mathcal C(A)^\perp. $$

这里的“恰好”很关键: 所有垂直方向都要消去, 子空间内的信息也要完整保留. 我们接下来就按这个要求构造映射.

2.1 坐标轴对齐时, 过滤该怎么做

先把二维嵌入四维的前两个方向:

$$ E=\begin{bmatrix} 1&0\\ 0&1\\ 0&0\\ 0&0 \end{bmatrix}, \qquad E\begin{bmatrix}2\\ 3\end{bmatrix} =\begin{bmatrix}2\\ 3\\ 0\\ 0\end{bmatrix}. $$

现在后两个方向混入了噪声, 测量 $\vec b$ 的四个坐标成为 $2,3,5,9$. 要过滤它, 最直接的动作就是保留前两个坐标, 舍去后两个坐标. 因此我们主动选取

$$ M=\begin{bmatrix} 1&0&0&0\\ 0&1&0&0 \end{bmatrix}, \qquad M \begin{bmatrix}2\\ 3\\ 5\\ 9\end{bmatrix} =\begin{bmatrix}2\\ 3\end{bmatrix}. $$

这个 $M$ 恰好等于 $E^{\mathsf T}$. 先有保留哪些坐标, 消去哪些坐标的需求, 再得到矩阵的每一列: 前两个自然基的单位输入分别输出两个单位坐标, 后两个单位输入都输出零.

它的输出为零, 当且仅当前两个坐标都是零. 因此它的零空间完整地由后两个坐标方向组成, 正好是这个二维平面的正交补. 再用 $E$ 嵌入一次, 就得到四维里的投影点 $(2,3,0,0)$.

把维度再减小一点, 就能在图上直接观察这件事: 一维输入嵌入二维, 先让嵌入方向与横轴重合, 再慢慢转动它.

一维模式分别调整方向与长度; 二维模式调整两个单位基的夹角. 橙色虚线表示正交偏差.

先把图中基的长度保持为 $1$, 只转动嵌入方向. 你会看到, 直接取测量的横坐标, 读到的数字随方向变化, 也可能混入正交偏差; 而 $A^{\mathsf T}$ 的读取方向会随着嵌入方向一起转动, 得到的仍然是原来的一维输入. 基的像保持单位长度时, 任意方向上的一维嵌入都可以直接用转置回传.

这里的“基”也要分清: 原来的基经过 $A$ 映射, 构成的是嵌入子空间的基. 这个基可以朝向二维空间中的任意方向, 它的长度决定了一个单位输入被放大多少.

接着把基的长度改成 $s$. 沿嵌入方向取一个单位矢量, 其自然坐标记作 $\vec q$, 就有

$$ A\vec x=sx\vec q, \qquad \vec b=sx\vec q+\vec e. $$

这里输入只有一维, $\vec x$ 的唯一坐标就是标量 $x$. 嵌入先把这个坐标放大为沿 $\vec q$ 的长度 $sx$; 正交偏差经过投影消去后, 沿单位方向读到的也是 $sx$. 而 $A$ 的基方向本身长 $s$, 用它读取还会再带入一个 $s$, 所以

$$ A^{\mathsf T}\vec b=s(sx)=s^2x. $$

这就看见了校准的来源: 嵌入与回传各带入一次尺度, 合起来形成 $s^2$ 的响应. 后面用 $1/s^2$ 校准, 便恢复原输入. 旋转改变各个高维自然坐标中的分量; 伸缩改变这套映射对输入的响应尺度.

再切到二维模式, 把两根单位基的夹角从 $90^\circ$ 调到 $60^\circ$. 长度保持为 $1$, 沿一个方向的信号, 也会在另一个方向上留下读数. 于是多维情形的校准, 还要消除这些方向之间的交叉响应. 第 3 节会把它们集中写成一张响应表.

2.2 子空间倾斜时, 先换一组坐标

在最开始的四维例子里, 有效方向与自然坐标轴对齐, 所以可以直接截取坐标. 图中的旋转则提醒我们: 子空间相对自然坐标轴倾斜以后, 信号和垂直偏差都会分散到原来的各个坐标里. 这时随便删除几个数字, 就会同时删掉有效信息.

但我们可以让坐标轴对齐子空间, 再做刚才的截取.

在 $\mathcal C(A)$ 内选取 $n$ 个标准正交的基方向 $\boldsymbol q_1,\ldots,\boldsymbol q_n$, 把它们在原自然基下的坐标收成矩阵 $Q$. 再在垂直于子空间的方向上补齐标准正交基, 就得到整个 $m$ 维空间的一组新基, 记它的坐标矩阵为 $U$.

这些方向可以逐个选出来: 先把已有方向上的投影减去, 再把剩下的方向归一化, 直到补齐. 子空间内的前 $n$ 个方向描述有效信息, 后 $m-n$ 个方向描述垂直偏差.

因为新基标准正交, 一个矢量在第 $i$ 个新基方向上的坐标, 就是它沿这个单位方向的投影, 也就是内积 $\langle\vec u_i,\vec b\rangle$. 把这些坐标收起来, 换基过程便写成

$$ U^{\mathsf T}\vec b =\begin{bmatrix}\vec c \\ \vec h\end{bmatrix}. $$

其中 $\vec c$ 记录有效信号在子空间内的 $n$ 个坐标, $\vec h$ 记录垂直偏差的 $m-n$ 个坐标. 保留前一部分, 就得到

$$ \vec b \xmapsto{\ U^{\mathsf T}\ } \begin{bmatrix}\vec c \\ \vec h\end{bmatrix} \xmapsto{\ [I_n\ \ 0 ]\ } \vec c =Q^{\mathsf T}\vec b. $$

这里每一步都由左边的矩阵作用于坐标. $Q^{\mathsf T}$ 的几何动作也就清楚了: 按子空间的正交基读取坐标, 同时把所有垂直方向截去. 换回高维表示, $Q\vec c$ 就是子空间中的投影点.

前面的四维例子, 正是新基已经与自然基重合的情形. 现在的换基, 把同一个过滤方法推广到了任意方向的嵌入子空间.

2.3 怎样从这个过滤动作得到 $A^{\mathsf T}$

我们已经构造出了 $Q^{\mathsf T}$. 那么, 原来的 $A^{\mathsf T}$ 又是怎么出现的?

$Q$ 是为了看清过滤过程而选的新基; 实际问题已经给出了 $A$ 的各列, 它们也在子空间中构成一组基. 可以把这些方向想成子空间中的 $n$ 根测量探针. 沿用这些现成的方向读取信号, 后面就能用原来的 $A$ 给整套读取过程做校准.

先把 $A$ 的第 $j$ 列写到子空间的正交基 $Q$ 下, 记这列坐标为 $\vec f_j$. 把这些坐标并排收成 $n\times n$ 矩阵 $F$, 就有

$$ \vec a_j=Q\vec f_j, \qquad A\vec x=Q(F\vec x). $$

这里 $F\vec x$ 把原来沿 $A$ 各列组合的系数, 转换成沿 $Q$ 组合的系数. 两组基描述同一个子空间, $F$ 是一次可逆的坐标变换.

现在子空间中的信号已经有了正交坐标 $\vec c$. 沿 $\boldsymbol a_j$ 测量它, 相当于用这个方向的坐标 $\vec f_j$ 去读取 $\vec c$, 读数为

$$ r_j=\langle\vec f_j,\vec c\rangle =\sum_{k=1}^{n}f_{kj}c_k. $$

把 $n$ 个读数收起来, 这一步就是 $\vec r=F^{\mathsf T}\vec c$. 于是整个读取映射由两步组成: 先用 $Q^{\mathsf T}$ 取得子空间坐标, 再用 $F^{\mathsf T}$ 把它们转换成沿原来各个基方向的读数.

怎样知道这两步合起来就是 $A^{\mathsf T}$? 仍然看自然基的单位输入会被送到哪里.

给整个映射输入第 $i$ 个自然基的单位坐标 $\vec e_i$. 它沿 $\boldsymbol q_k$ 的坐标为 $q_{ik}$, 所以第 $j$ 个读数为

$$ \sum_{k=1}^{n}f_{kj}q_{ik}=a_{ij}. $$

最后一个等号, 正是前面 $\vec a_j=Q\vec f_j$ 的第 $i$ 个坐标. 这说明第 $i$ 个单位输入得到的输出, 是把 $a_{i1},\ldots,a_{in}$ 这些标量依次收成的一列; 这列恰好就是 $A^{\mathsf T}$ 的第 $i$ 列.

所有自然基的像都对上了, 整个映射也就确定了:

$$ \boxed{ A^{\mathsf T}\vec b =F^{\mathsf T}\bigl(Q^{\mathsf T}\vec b\bigr) =F^{\mathsf T}\vec c }. $$

这样, $A^{\mathsf T}$ 就从基的坐标关系中出现了: 先按子空间方向降维过滤, 再在低维内转换读数. 直接使用 $A^{\mathsf T}$, 就把这两步合在了一次映射里.

2.4 为什么零空间恰好是正交补

现在可以仔细回答最开始的“恰好”了. 前一步 $Q^{\mathsf T}$ 已经消去了所有垂直分量, 后面的读数转换会不会再把子空间中的某些方向也消掉?

沿 $A$ 各列读取的含义, 是

$$ A^{\mathsf T}\vec b =\begin{bmatrix} \langle\vec a_1,\vec b\rangle\\ \vdots\\ \langle\vec a_n,\vec b\rangle \end{bmatrix}. $$

若 $\vec b$ 垂直于子空间, 它就垂直于每个 $\boldsymbol a_j$, 所有读数自然为零. 反过来, 若所有读数都为零, 它就垂直于每个 $\boldsymbol a_j$; 而子空间中的任何方向, 都能用这些基方向线性组合出来, 所以它也就垂直于整个子空间.

这两个方向连起来, 才得到完整的结论:

$$ A^{\mathsf T}\vec b=\vec0 \quad\Longleftrightarrow\quad \boldsymbol b\perp\mathcal C(A), \qquad \boxed{\ker(A^{\mathsf T})=\mathcal C(A)^\perp}. $$

特别地, 一个矢量若既在子空间内, 又垂直于整个子空间, 它也必须垂直于自己, 因而长度为零. 所以子空间中的非零信息, 总会被至少一个方向读到. 两点的读数相同, 它们的差就被读成零, 这又保证了两点重合. 于是 $F^{\mathsf T}$ 在这 $n$ 维内也保留了全部信息.

现在再用秩-零化度定理来看: $A^{\mathsf T}$ 的零空间有 $m-n$ 维, 保留下来的读数有 $n$ 个独立维度. 前面的坐标关系说明了消去的是哪些方向, 这条定理则把保留与消去的维数接了起来.

因此, $A^{\mathsf T}$ 天然扮演着正交噪声过滤器和高维信息降维回传的角色. 对于 $\vec b=\vec p+\vec e$, 它得到的读数满足

$$ A^{\mathsf T}\vec b=A^{\mathsf T}\vec p. $$

实际噪声也可以沿子空间分布, 这部分会随信号一起保留. 这里的“正交去噪”, 具体消去的就是垂直分量. 接下来的问题是: 子空间信息保留完整以后, 怎样把这些读数转换成我们想求的原输入坐标?

3. 去噪以后为什么还要校准

到这里, 很容易顺势问: 既然 $A^{\mathsf T}$ 已经能去噪, 而且子空间里的信息也没丢, 直接拿它当逆可以吗?

先算一遍. 若真实输入 $\vec x$ 的两个坐标是 $2,3$, 则

$$ A\vec x=\begin{bmatrix}2\\ 3\\ 5\end{bmatrix}. $$

给它加上一段三个坐标为 $1,1,-1$ 的垂直噪声 $\vec e$, 测量就变成

$$ \vec b=\begin{bmatrix}3\\ 4\\ 4\end{bmatrix}. $$

两根探针与 $\vec e$ 的内积都是零, 噪声确实会消去. 但读数是

$$ \vec r=A^{\mathsf T}\vec b =\begin{bmatrix}7\\ 8\end{bmatrix}. $$

我们想得到的是 $(2,3)$, 现在得到 $(7,8)$. 这一步保留了所需信息, 接下来还要把读数转换成原输入坐标.

原因可以从测量探针本身看出来. $\vec a_1,\vec a_2$ 都长于一个单位, 彼此也带有夹角. 用一根较长的探针取内积, 读数会受到它长度的影响; 两根探针相互倾斜, 沿其中一根的变化, 也会被另一根读到. 这种交叉响应, 和测量系统里的 crosstalk, 串扰 很相似.

想象用两把呈 $60^\circ$ 夹角的尺子来描述平面. 沿第一把尺子的方向移动, 第二个方向上的投影也会变化. 内积读数与这组基下的组合系数, 需要通过一次坐标转换接起来.

3.1 用已知输入给测量系统做校准

工程上校准传感器时, 会先施加一个已知输入, 看看它实际读出了多少. 这里可以完全照做: 先用 $A$ 嵌入一个已知的 $\vec x$, 再用 $A^{\mathsf T}$ 读取.

$$ \vec x\xmapsto{\ A\ }A\vec x \xmapsto{\ A^{\mathsf T}\ }A^{\mathsf T}(A\vec x). $$

这套测量系统对输入的完整响应, 就是 $A^{\mathsf T}A$. 在当前例子里,

$$ A^{\mathsf T}(A\vec x) =\begin{bmatrix}2x_1+x_2 \\ x_1+2x_2\end{bmatrix}, \qquad G=A^{\mathsf T}A =\begin{bmatrix}2&1\\ 1&2\end{bmatrix}. $$

现在便清楚了: 两个读数与原输入之间隔着一个 $G$, 而 $G$ 已经被我们用已知输入测出来了.

这趟 $n\to m\to n$ 的过程可以求逆. 这里送去测量的 $A\vec x$ 本来就完全在子空间内, 垂直方向的分量为零, 所以 $A^{\mathsf T}$ 的过滤功能在这次校准中没有消去任何有效信息. 实际测量 $\vec b$ 则可能包含垂直噪声, 同一项过滤功能恰好把它消去.

列满秩的 $A$ 在嵌入时保留了全部输入信息, $A^{\mathsf T}$ 又在子空间内保留了全部信息, 两步组合以后, 不同输入仍然可以区分. 按秩-零化度定理, $n\times n$ 的 $G$ 就是满秩可逆的.

因此, 下一步直接用 $G^{-1}$ 校准刚才的读数:

$$ \widehat{\vec x} =G^{-1}\vec r =\frac13\begin{bmatrix}2&-1\\ -1&2\end{bmatrix} \begin{bmatrix}7\\ 8\end{bmatrix} =\begin{bmatrix}2\\ 3\end{bmatrix}. $$

两步合在一起, 就得到熟悉的公式:

$$ \boxed{ \widehat{\vec x}=(A^{\mathsf T}A)^{-1}A^{\mathsf T}\vec b }. $$

先用 $A^{\mathsf T}$ 降维去噪, 再用 $(A^{\mathsf T}A)^{-1}$ 校准坐标. 我们主动选择了 $A^{\mathsf T}$ 的过滤功能, 随后就根据它的完整响应, 补偿测量带来的尺度与耦合. 这样理解, 两个因子的顺序就自然确定了.

3.2 Gram 矩阵是在这里出现的

刚才送入不同的已知输入, 也可以逐个送入自然基的单位坐标. 第 $j$ 个单位输入先变成 $\vec a_j$, 再被各根探针读取, 所以 $G$ 的第 $i,j$ 个数字为

$$ G_{ij}=\langle\vec a_i,\vec a_j\rangle. $$

对角线是探针自己的长度平方, 其余数字是相互之间的响应. 这张两两内积组成的表, 就叫 Gram 矩阵. 它把我们刚才描述的尺度, 夹角与串扰, 集中记录了下来.

若两根探针相互垂直, 而且长度都是 $1$, 自己测自己得到 $1$, 彼此测量得到 $0$, 于是 $G=I$. 这时读数直接等于组合系数, 校准步骤就省去了. 这也是标准正交基在这里特别方便的原因.

现在再看常见的写法

$$ A^{\mathsf T}(\vec b-A\widehat{\vec x})=\vec0 \quad\Longrightarrow\quad A^{\mathsf T}\vec b=(A^{\mathsf T}A)\widehat{\vec x}. $$

它表达的就是: 估计结果与测量之间, 剩下的差全部垂直于子空间, 经过过滤后为零. 等式左侧是测量的有效读数, 右侧是输入经过整套测量系统后的读数, 二者应当相同. 这就是正规方程. 前面的去噪与校准, 在这里被收进了一个等式.

4. 把校准理解成坐标变换

前面的“传感器校准”已经能说明为什么要乘逆矩阵. 不过, 沿着基变换的思路还能再往前一步: 这两组数字, 究竟是同一个矢量在哪两组基下的坐标?

仍然看子空间中的那个矢量, 其自然基下的三个坐标是 $2,3,5$. 它可以由原来的两个基方向合成:

$$ \boldsymbol p=2\boldsymbol a_1+3\boldsymbol a_2. $$

也就是说, $(2,3)$ 是它在 $\boldsymbol a_1,\boldsymbol a_2$ 下的坐标.

为了让读数 $(7,8)$ 也能直接合成同一个矢量, 我们在子空间中另选两个基方向:

$$ \vec d_1=\frac13\begin{bmatrix}2\\ -1\\ 1\end{bmatrix}, \qquad \vec d_2=\frac13\begin{bmatrix}-1\\ 2\\ 1\end{bmatrix}. $$

可以直接算出

$$ \boldsymbol p=7\boldsymbol d_1+8\boldsymbol d_2. $$

于是同一个 $\boldsymbol p$ 有了两套描述:

$$ \underbrace{\begin{bmatrix}2\\ 3\end{bmatrix}}_{\boldsymbol a_1,\boldsymbol a_2\text{ 下的坐标}} \xmapsto{\ G\ } \underbrace{\begin{bmatrix}7\\ 8\end{bmatrix}}_{\boldsymbol d_1,\boldsymbol d_2\text{ 下的坐标}}. $$

反过来左乘 $G^{-1}$, 就把第二套坐标转换成第一套. 矢量相同, 描述它的基和坐标改变了. 这正好接上前文对基变换的理解.

这两个新方向也很有意思: $\boldsymbol d_1$ 与 $\boldsymbol a_2$ 垂直, 与 $\boldsymbol a_1$ 的内积为 $1$. 因此, 拿 $\boldsymbol d_1$ 去测量 $\boldsymbol p$, 第二个方向的贡献会消失, 留下的恰好是第一个系数 $2$. $\boldsymbol d_2$ 同理, 能直接读出第二个系数 $3$.

这就是原基的倒易基, 也常称为其对偶基的欧氏表示. 原基负责合成, 倒易基负责把各个组合系数单独读出来. 标准正交时, 基方向本身就具备这项读取功能, 两组基重合.

一般情形也能这样构造. 第 2 节已经说明, $A^{\mathsf T}$ 在子空间内保留全部信息, 输入, 输出的维数又相同, 所以可以在子空间中找到唯一的 $\vec d_j$, 使

$$ A^{\mathsf T}\vec d_j=\vec e_j, \qquad \langle\vec a_i,\vec d_j\rangle=\delta_{ij}. $$

这里 $\vec e_j$ 是第 $j$ 个自然基的单位坐标. 任意子空间矢量的读数为 $\vec r$ 时, 用这些读数加权 $\boldsymbol d_j$, 就会合成那个矢量. 因此 $G$ 与 $G^{-1}$ 确实描述了两组基之间的坐标转换.

5. 嵌入高维后的向量坐标在哪

现在再看一个讨论中很容易困惑的问题: 标准正交时, 既然 $Q^{\mathsf T}Q=I$, 为什么 $Q$ 和 $Q^{\mathsf T}$ 的数字看起来仍然不同?

先用一个不带根号的例子:

$$ Q=\begin{bmatrix} 0&3/5\\ 1&0\\ 0&4/5 \end{bmatrix}, \qquad Q^{\mathsf T}=\begin{bmatrix} 0&1&0\\ 3/5&0&4/5 \end{bmatrix}. $$

第一列的方向沿三维空间的第二个自然轴, 第二列沿一个 $3$-$4$-$5$ 直角三角形的斜边. 两列都长 $1$, 而且相互垂直. 可它们左上角的 $2\times2$ 数表, 确实长得不同.

把各列的含义说出来就清楚了:

  • $Q$ 的一列: 二维中的一个自然基矢量, 嵌入三维以后, 用三维自然基写出它的坐标;
  • $Q^{\mathsf T}$ 的一列: 三维中的一个自然基矢量, 经过读取映射以后, 用二维自然基写出结果的坐标.

它们分别回答两个方向的问题. 特别是, 斜放的二维平面自身的两个方向, 分布在三维的多个自然坐标中. 只截取前两个坐标, 看到的是它在外部坐标平面上的投影.

想直接看见嵌入前后的对应, 可以把三维参照系也对齐: 取 $Q$ 的两列作为前两个基方向, 再补上一个垂直于子空间的单位方向, 组成标准正交基 $U$.

$$ U=\begin{bmatrix} 0&3/5&4/5\\ 1&0&0\\ 0&4/5&-3/5 \end{bmatrix}. $$

这时, 左乘 $U^{\mathsf T}$ 的意义就很明确了: 沿 $U$ 的各个单位轴取内积, 求出同一个矢量在 $U$ 下的坐标. 于是

$$ U^{\mathsf T}(Q\vec c) =\begin{bmatrix}\vec c\\ 0\end{bmatrix}. $$

若先给一组三维的 $U$ 坐标, 记作 $\vec d$, 用 $U\vec d$ 合成, 再让 $Q^{\mathsf T}$ 读取, 得到

$$ Q^{\mathsf T}(U\vec d) =\begin{bmatrix}I_2&0\end{bmatrix}\vec d. $$

在对齐后的参照系里, 两种操作就是:

$$ \begin{bmatrix}c_1\\ c_2\end{bmatrix} \longmapsto \begin{bmatrix}c_1\\ c_2\\ 0\end{bmatrix}, \qquad \begin{bmatrix}c_1\\ c_2\\ h\end{bmatrix} \longmapsto \begin{bmatrix}c_1\\ c_2\end{bmatrix}. $$

共享的两个方向上, 数字都原样保留. 这个二维子空间可以相对三维自然轴倾斜, 它自身的网格仍然是标准直角网格. 这种保持长度和夹角的嵌入, 叫作等距嵌入. 自然基描述“在房间里朝哪边”, 子空间中的标准正交基描述“子空间内部的坐标网格”, 两者各有用处.

5.1 保持 $A^{\mathsf T}$ 不变, 只给 $A$ 换基

还可以沿着另一个问题继续想: 对于前面一般的 $A$, 如果让它的列也用“读数对应的那组基”表达, 会得到什么?

先照一个容易实际计算的方案: 保留三维的前两个自然轴 $\boldsymbol e_1,\boldsymbol e_2$, 再补上垂直于子空间的方向 $\boldsymbol n$, 它的坐标为 $1,1,-1$. 把这组基记作 $W_0$.

逐个表示 $A$ 的两个基方向, 会得到

$$ \boldsymbol a_1=2\boldsymbol e_1+\boldsymbol e_2-\boldsymbol n, \qquad \boldsymbol a_2=\boldsymbol e_1+2\boldsymbol e_2-\boldsymbol n. $$

因此, 把 $A$ 的各列坐标换到 $W_0$ 下, 得到

$$ W_0^{-1}A =\begin{bmatrix} 2&1\\ 1&2\\ -1&-1 \end{bmatrix}. $$

在这个例子里, 前两个坐标组成的数表, 恰好就是 $G$. 第三个坐标里的 $-1$ 也有明确任务: 这组基的三个方向相互带有夹角, 需要用 $-\boldsymbol n$ 抵消前两个方向合成时带来的子空间外分量, 最后才得到子空间中的 $\boldsymbol a_j$.

如果把前两个基方向也改成子空间自己的 $\boldsymbol a_1,\boldsymbol a_2$, 得到另一组基 $W_A$, 情况就更直接:

$$ W_A^{-1}A =\begin{bmatrix} 1&0\\ 0&1\\ 0&0 \end{bmatrix}. $$

这里右侧 $A$ 的每一列都当作坐标数组, 由左侧换基映射逐列处理. 用自己的基描述自己, 两个组合系数原样保留, 垂直方向的坐标为零.

要把“换基后出现 $G$“这个观察推广, 第 4 节的倒易基正好派上用场. 取 $\boldsymbol d_1,\boldsymbol d_2,\boldsymbol n$ 组成基 $W_D$, 就有

$$ W_D^{-1}(A\vec x)=\begin{bmatrix}G\vec x\\ 0\end{bmatrix}. $$

它的前两个坐标正是 $A^{\mathsf T}$ 的读数, 最后一个坐标为零. 同一个子空间矢量, 用原基描述得到 $\vec x$, 用倒易基描述得到 $G\vec x$. 校准就是把后一组坐标转换成前一组, 因而使用 $G^{-1}$.

6. 欠定方程与最小范数解

前面处理的是低维嵌入高维. 现在反过来, 让一个 $m\times n$ 的矮胖矩阵把高维压缩成低维, $m<n$, 并假设它的秩为 $m$.

比如一个 $1\times3$ 矩阵:

$$ A=\begin{bmatrix}1&2&2\end{bmatrix}, \qquad A\vec x=x_1+2x_2+2x_3. $$

$A$ 的三列各自是一个一维输出, 其坐标数字分别为 $1,2,2$. 三个输入共同合成一个结果. 现在指定结果为 $9$, 就有

$$ x_1+2x_2+2x_3=9. $$

$(9,0,0)$ 可以, $(1,2,2)$ 可以, $(5,1,1)$ 也可以. 三个未知数只有一个约束, 所以留出了许多选择. 这就是欠定方程.

到这里, 读者很可能会问: 前面还在找“最接近的结果”, 怎么到了欠定方程, 就开始挑“最短的输入”? 这两个“最小”究竟在比较什么?

区别就在于当前剩下的问题: 超定时, 测量可能偏离子空间, 所以要挑一个最近的输出; 现在这些输入全都准确产生 $9$, 输出已经一致, 我们要在输入之间作选择.

一种常用标准, 是让输入本身的长度最短, 即最小化 $|\vec x|^2$. 它叫作最小范数解. 例如两个同样有效的驱动器合力提供 $6$ 个单位的输出, 全部交给一个驱动器是 $(6,0)$, 平分是 $(3,3)$; 按平方和比较, 前者为 $36$, 后者为 $18$. 这个标准鼓励合理分配, 也会抑制相互抵消的大动作.

6.1 哪些变化可以直接取零

回到三维输入. 假如某个变化 $\vec k$ 满足

$$ k_1+2k_2+2k_3=0, $$

那么把它加到任意一个解上, 输出都不变. 这些变化组成了输入空间里的一个二维平面, 称为 $A$ 的零空间, 记作 $\ker A$.

不过, 输出明明已经是一维, 怎么又出现了一个二维平面? 这片平面到底在哪?

输出端是一维结果, 输入端仍然是三维. 我们现在比较的是不同输入之间的变化: 有一整张二维平面的变化会被 $A$ 消去. 这片零空间平面就在输入端, 描述压缩时丢掉的自由度.

要选最短输入, 可以把每个输入拆成“沿零空间的部分”和“垂直于零空间的部分”:

$$ \vec x=\vec s+\vec k, \qquad \vec k\in\ker A,\quad \vec s\perp\ker A. $$

沿零空间的 $\vec k$ 经过 $A$ 后为零, 而长度平方满足

$$ A\vec x=A\vec s, \qquad |\vec x|^2=|\vec s|^2+|\vec k|^2. $$

于是选择很直接: 反正零空间分量怎样变都不影响输出, 就把它取零. 保留下来的 $\vec s$ 产生相同结果, 而且长度最短.

与零空间垂直的这些方向组成它的正交补, 记作 $S=(\ker A)^\perp$. 在刚才三维压成一维的例子里, 零空间是一张平面, $S$ 就是垂直于它的一条直线.

7. 怎样从低维生成最短的高维输入

现在我们想要一个展开映射: 把低维目标变成高维输入, 并且让生成的输入自然落在刚才的 $S$ 里.

看看 $A^{\mathsf T}$:

$$ A^{\mathsf T}=\begin{bmatrix}1\\ 2\\ 2\end{bmatrix}, \qquad \lambda\xmapsto{\ A^{\mathsf T}\ } \begin{bmatrix}\lambda\\ 2\lambda\\ 2\lambda\end{bmatrix}. $$

这次它负责升维. 它的输出沿 $(1,2,2)$ 方向, 而这个方向与刚才整个零空间垂直: 对任意 $\vec k\in\ker A$, 内积就是 $k_1+2k_2+2k_3=0$. 所以这正是所需的展开方向.

要产生输出 $9$, 权重 $\lambda$ 应该取多少? 先看看“展开以后再压缩”会得到什么:

$$ \lambda \xmapsto{\ A^{\mathsf T}\ } \begin{bmatrix}\lambda\\ 2\lambda\\ 2\lambda\end{bmatrix} \xmapsto{\ A\ }9\lambda. $$

目标是 $9$, 所以先把它校准成权重 $1$, 再展开, 得到最短输入 $(1,2,2)$. 先在低维校准权重, 再用 $A^{\mathsf T}$ 嵌入高维.

7.1 把输入空间的基对齐

把 $A^{\mathsf T}$ 当成独立的展开矩阵, 设它的各列为 $\vec v_1,\ldots,\vec v_m$, 则

$$ \vec x=A^{\mathsf T}\vec\lambda =\sum_{i=1}^{m}\lambda_i\vec v_i. $$

这里每个 $\lambda_i$ 都是 scalar, 给对应的高维基方向加权. 我们希望这些像方向都落在 $S$, 也就是零空间的正交补里. 要看清这一点, 可以照第 5 节的办法, 把输入空间的基先对齐.

在 $S$ 里选一组标准正交基, 组成 $Q$; 再把零空间里的标准正交方向补进去. 这样, 每个输入都有一组描述有效方向的坐标 $\vec c$, 以及一组描述零空间方向的坐标 $\vec h$.

$A$ 会消去全部 $\vec h$. 对剩下的 $\vec c$, 它给出一个低维映射 $F$:

$$ A\vec x=F\vec c, \qquad A(Q\vec c)=F\vec c. $$

当前 $A$ 的秩为 $m$, 所以 $Q$ 有 $m$ 个独立方向, $F$ 是一个可逆的 $m\times m$ 矩阵. 它把有效输入坐标一一映到目标坐标.

再把这些像写回原自然基, 会得到 $A^{\mathsf T}$ 的各列也是 $Q$ 各列的组合. 具体地, 若 $F$ 的数字为 $f_{ik}$, $Q$ 的数字为 $q_{jk}$, 第 $j$ 个旧自然轴在 $Q$ 各轴上的坐标, 正好是 $q_{j1},\ldots,q_{jm}$. 将这些有效坐标交给 $F$, 它经过 $A$ 后的第 $i$ 个坐标就为

$$ a_{ij}=\sum_{k=1}^{m}f_{ik}q_{jk}. $$

按这些坐标数字组成 $A^{\mathsf T}$ 的各列, 第 $i$ 列就是 $\sum_k f_{ik}\vec q_k$. 所以整个展开过程为

$$ \boxed{A^{\mathsf T}\vec\lambda=Q(F^{\mathsf T}\vec\lambda)}. $$

从最末端的权重开始读: 先用低维的 $F^{\mathsf T}$ 改变组合系数, 再用 $Q$ 嵌入高维的 $S$. 生成的输入从一开始就沿 $S$ 的基方向组合, 零空间方向的系数自然为零.

而 $F^{\mathsf T}$ 也可逆: 按坐标数字检查, 它与 $(F^{-1})^{\mathsf T}$ 依次作用, 会得到单位映射. 因此这些权重能够覆盖全部 $S$, 也就得到

$$ \mathcal C(A^{\mathsf T})=(\ker A)^\perp. $$

这项关系在这里来自对齐基后的坐标组合. $A^{\mathsf T}\vec\lambda$ 自始至终都是一个升维映射.

7.2 先校准, 后展开

一般情形下, “展开再压缩”的完整响应就是

$$ \vec\lambda \xmapsto{\ A^{\mathsf T}\ }\vec x \xmapsto{\ A\ }AA^{\mathsf T}\vec\lambda. $$

因此给定目标 $\vec b$, 先用这套响应的逆找到权重, 再展开:

$$ \vec b \xmapsto{\ (AA^{\mathsf T})^{-1}\ }\vec\lambda \xmapsto{\ A^{\mathsf T}\ }\widehat{\vec x}. $$

这就得到另一个熟悉的公式:

$$ \boxed{ \widehat{\vec x}=A^{\mathsf T}(AA^{\mathsf T})^{-1}\vec b }. $$

在当前 $\operatorname{rank}A=m$ 的条件下, $A^{\mathsf T}$ 把 $m$ 维权重一一嵌入 $S$; $A$ 在 $S$ 内也能区分所有输入, 因为能被消成零的方向已经单独放进了零空间. 因此 $AA^{\mathsf T}$ 保留全部 $m$ 维信息, 可以求逆.

我们从目标出发得到的两项任务, 现在都完成了: $A\widehat{\vec x}=\vec b$, 而且 $\widehat{\vec x}$ 的零空间分量为零, 所以它是最小范数解.

8. 为什么校准都在低维, 顺序却相反

把两种过程并排看:

情形 已知的 $\vec b$ 在哪 要找的 $\vec x$ 在哪 操作顺序
低维嵌入高维, $m>n$, 列满秩 高维测量空间 低维输入空间 $A^{\mathsf T}$ 降维去噪, 再用 $(A^{\mathsf T}A)^{-1}$ 校准
高维压缩到低维, $m<n$, 秩为 $m$ 低维结果空间 高维输入空间 $(AA^{\mathsf T})^{-1}$ 校准权重, 再用 $A^{\mathsf T}$ 升维分配

两边看起来互为镜像: 一个嵌入, 一个压缩, 校准似乎也应该可以随意对调. 但它们之间有一项决定性的约束: 矩阵最多保留 $\min(m,n)$ 个独立方向, 完整可逆的校准只能在保留这些方向的空间里进行.

这就是秩的“取小”特性带来的不对称. 两边都需要消除尺度与耦合, 而在这两类满秩情形中, 低维端保留全部有效信息, 高维端包含被压掉的方向.

为什么恰好在低维? 以二维嵌入三维为例, 完整信息原本就只有两维. $A^{\mathsf T}A$ 在二维内处理它, 可以是一一对应; $AA^{\mathsf T}$ 却会把三维里垂直于子空间的整条方向压成零, 这个三维矩阵就无法整体求逆.

反过来, 三维压成一维, $AA^{\mathsf T}$ 是一维里的有效响应, 可以校准; $A^{\mathsf T}A$ 作用于整个三维输入时, 那张二维零空间平面仍然会被压到零.

校准需要可逆, 而可逆部分的维数, 由实际保留下来的自由度决定. 在这两类满秩矩阵里, 它恰好是较小的 $\min(m,n)$.

顺序的差异也就清楚了: 第一种情况, 测量还在高维, 要先降维, 才能进入低维校准; 第二种情况, 目标本来就在低维, 先算好展开权重, 再生成高维输入. 秩决定完整可逆的校准在哪一端, 数据的起点决定先校准还是后校准. 这一约束把两个看似对称的过程分成了不同顺序, 也就显露出左逆与右逆各自的形式.

8.1 左逆, 右逆的名称怎么理解

对于嵌入, 先施加 $A$, 再施加刚才求出的伪逆 $A^+$, 每个输入都能恢复:

$$ A^+(A\vec x)=\vec x, \qquad A^+A=I_n. $$

这叫左逆关系. 对于压缩, 先用 $A^+$ 生成最短输入, 再用 $A$ 产生输出, 每个低维目标都能实现:

$$ A(A^+\vec b)=\vec b, \qquad AA^+=I_m. $$

这叫右逆关系. 仍然从最后面的坐标开始读, 依次接受左侧映射即可.

普通逆矩阵的组合顺序也是同一回事. 若先经过 $M$, 再经过 $N$, 撤销时就先撤销 $N$, 再撤销 $M$, 因而 $(NM)^{-1}=M^{-1}N^{-1}$. 读公式时跟着操作顺序走, 就很容易记住这些因子该放在哪里.

9. 两个“最小”怎样统一成 Moore-Penrose 伪逆

到这里, 我们分别处理了两种情况: 测量偏离嵌入子空间, 就投影到最近点; 同一个结果有许多输入, 就把零空间分量取零.

这两件事可以同时发生. 知乎文章里的模型就很适合把它们放在一起看:

$$ A=\begin{bmatrix}1&0\\ 1&0\end{bmatrix}, \qquad A\begin{bmatrix}x_1\\ x_2\end{bmatrix} =\begin{bmatrix}x_1\\ x_1\end{bmatrix}. $$

可以把它想成沿竖直方向落到直线 $y_2=y_1$ 上: 原来的横坐标决定落点, 高度信息在映射中丢掉了. 现在给定一个测量点, 其坐标为 $\vec b$, 两个分量为 $b_1,b_2$, 想估计它对应的输入.

先处理测量误差. 斜线上离它最近的点是 $(t,t)$, 其中

$$ t=\frac{b_1+b_2}{2}. $$

这个平均值可以直接从误差平方看出来:

$$ (t-b_1)^2+(t-b_2)^2 =2\left(t-\frac{b_1+b_2}{2}\right)^2 +\frac{(b_1-b_2)^2}{2}. $$

再处理输入的选择. 能产生 $(t,t)$ 的输入是 $(t,s)$, 高度 $s$ 任意. 要让输入长度最短, 就取 $s=0$. 两步合起来:

$$ A^+\vec b=\begin{bmatrix}(b_1+b_2)/2\\ 0\end{bmatrix}, \qquad A^+=\begin{bmatrix}1/2&1/2\\ 0&0\end{bmatrix}. $$

这便是 Moore-Penrose 伪逆的统一选择: 先让输出误差最小, 再在达到这个最小误差的全部输入中, 选长度最短的一个.

输入若能准确产生某个输出, 称它为这个输出的一个原像. 这个说法在这里就很好理解了: 先确定最近输出, 再从它的所有原像中选最短的.

9.1 一般矩阵里, 实际求逆的是哪部分

设 $A$ 的秩为 $r$, 它实际保留了 $r$ 个独立方向. 输入端把零空间方向分出去, 余下的 $S=(\ker A)^\perp$ 有 $r$ 维; 输出端的列空间也有 $r$ 维. $A$ 在这两个空间之间是一一对应的.

所以一般的伪逆, 也可以按照下面三步构造:

  1. 把高维测量投影到输出的列空间, 读取其中的 $r$ 个坐标;
  2. 在这 $r$ 维内, 对 $A$ 保留下来的映射求逆;
  3. 把得到的坐标嵌入输入端的 $S$, 把零空间分量取零.

若想把这三步写成公式, 可以在输出列空间, 输入 $S$ 中分别选取标准正交基, 组成 $P,Q$. 找这些轴的方法很熟悉: 每选一个新方向, 就减去沿已有单位轴的投影, 再把剩下的方向归一化; 重复直到选够 $r$ 个.

$P^{\mathsf T}$ 读取输出的 $r$ 个坐标, $Q$ 把 $r$ 个输入坐标嵌入 $S$. 用这些坐标描述 $A$ 保留下来的那部分映射, 得到一个可逆的 $r\times r$ 矩阵 $B$:

$$ B\vec e_j=P^{\mathsf T}(A\vec q_j). $$

也就是逐个把输入基方向 $\vec q_j$ 交给 $A$, 再用 $P^{\mathsf T}$ 读取结果, 把这些坐标并排收好. 于是

$$ \vec b\xmapsto{\ P^{\mathsf T}\ }\vec\beta \xmapsto{\ B^{-1}\ }\vec\alpha \xmapsto{\ Q\ }\widehat{\vec x}, \qquad \boxed{A^+=QB^{-1}P^{\mathsf T}}. $$

这也说明了为什么任意形状, 任意秩都能这样处理: 投影负责处理误差, 零空间取零负责选择最短输入, 中间只对保留下来的 $r$ 维映射求逆. 若 $r=0$, 全部输入都被压成零, 直接选择零输入, 得到 $A^+=0$.

最近投影点唯一, 零空间分量取零以后的输入也唯一, 所以最终的选择唯一. 换一组基来描述, 中间数字会变化, 选出的矢量相同.

10. 四个 Penrose 条件在说什么

到这一步再看四个条件, 它们各自描述的动作就比较具体了.

先观察两个组合:

  • $AA^+\vec b$: 把测量变成最短输入, 再生成输出, 得到 $\vec b$ 在列空间里的垂足;
  • $A^+A\vec x$: 先生成输出, 再选最短输入, 得到 $\vec x$ 去掉零空间分量的部分.

它们分别是输出空间, 输入空间里的正交投影.

第一个条件为

$$ AA^+A=A. $$

先用 $A$ 得到一个结果, 再用伪逆估计输入, 最后用 $A$ 生成结果, 落点与第一次相同. 输出既然已经在列空间内, 再投影一次会保留原样.

第二个条件为

$$ A^+AA^+=A^+. $$

先用伪逆选好一个最短输入, 让它生成结果, 再选一次最短输入, 仍然选中刚才那个. 这保证了这套选择前后一致.

还有两个条件:

$$ (AA^+)^{\mathsf T}=AA^+, \qquad (A^+A)^{\mathsf T}=A^+A. $$

它们把两端的投影固定为正交投影. 为什么这里会出现对称矩阵? 沿一组标准正交基 $\vec q_i$ 投影时, 先读取内积, 再重新合成:

$$ \Pi\vec u=\sum_i\vec q_i\langle\vec q_i,\vec u\rangle. $$

因此, $\langle\Pi\vec u,\vec v\rangle$ 与 $\langle\vec u,\Pi\vec v\rangle$ 都等于 $\sum_i\langle\vec q_i,\vec u\rangle\langle\vec q_i,\vec v\rangle$. 分别代入两个自然基坐标, 就得到 $\Pi_{ij}=\Pi_{ji}$, 也就是 $\Pi^{\mathsf T}=\Pi$.

这样, 四个条件就与前面的几何选择接上了: 第三个对应输出端的最近投影点, 第四个对应输入端消去零空间分量, 前两个保证施加映射和选择输入时能够保持一致. 满秩方阵的两个端点都保留全部方向, 这时伪逆就是普通逆矩阵.

11. 在逆运动学里, 这些操作有什么意义

对于机械臂, 在某个确定姿态 $\vec q$ 下, 关节速度与末端瞬时速度之间满足

$$ \vec v=J(\vec q)\dot{\vec q}. $$

这里的 $J$ 是 Jacobian, 雅可比矩阵. 它的第 $j$ 列告诉我们: 只让第 $j$ 个关节以单位速度运动, 会给末端带来怎样的速度. 所有关节的贡献, 按各自速度加权以后合成末端运动.

比如七个关节控制六维末端速度, 输入有七个数字, 目标有六个数字, 正好对应前面的高维压缩. 在 $J$ 满秩时,

$$ \dot{\vec q} =J^{\mathsf T}(JJ^{\mathsf T})^{-1}\vec v. $$

这里“先校准, 后分配”还有一个很实际的解释. 机械臂在不同姿态下, 朝某些方向运动比较容易, 朝另一些方向则很吃力. 例如手臂接近伸直时, 横向摆动很容易, 继续沿伸直方向移动就困难得多.

$(JJ^{\mathsf T})^{-1}$ 先根据当前姿态的完整响应, 算出各任务方向需要的补偿权重; 随后 $J^{\mathsf T}$ 把这些权重展开成关节速度. 中间的权重 $\vec\lambda$ 仍然写在任务空间里, 关节速度要等到展开以后才得到.

这项分配选出的标准是关节速度平方和最小, 可以把它理解成尽量减少各关节合计的运动量. 若要比较实际动能, 还需要把各连杆的质量, 惯量等算进去; 这会进一步给不同运动方向设置不同权重. 关于这种惯性度量, 可参见 Modern Robotics §8.1.3.

11.1 手不动, 肘部还可以调整

冗余关节提供的零空间自由度, 在这里也很直观: 手掌保持原来的位置和朝向, 肘部仍然可能摆动. 这些关节速度组合在当前姿态下经过 $J$ 后为零.

若想调整姿态, 可以先提出一个关节速度建议 $\vec w$, 再取出其中的零空间分量:

$$ \dot{\vec q} =J^+\vec v+(I-J^+J)\vec w. $$

因为 $J^+J$ 保留有效输入部分, $I-J^+J$ 就留下了零空间部分. 第二项可以用于远离关节限位等附加目标, 在当前瞬时模型中保持主任务的末端速度. 执行时随着姿态变化持续更新 $J$, 再计算下一步速度.

11.2 奇异点附近, 为什么关节速度会变大

只说“矩阵不可逆”, 还没有说明大速度具体从哪里来. 我们来看一个简单的方向缩放:

$$ J_\varepsilon=\begin{bmatrix} 1&0&0\\ 0&\varepsilon&0 \end{bmatrix}. $$

第一方向正常输出, 第二方向的输出被缩小成输入的 $\varepsilon$ 倍. 为了实现两个分量为 $v_1,v_2$ 的目标速度 $\vec v$, 需要

$$ J_\varepsilon^+\vec v =\begin{bmatrix}v_1\\ v_2/\varepsilon\\ 0\end{bmatrix}, \qquad \varepsilon\ne0. $$

比如末端要求这个方向速度为 $1$, 传动效果为 $0.1$, 就需要输入 $10$; 效果降到 $0.001$, 就需要输入 $1000$. 输出能力越来越弱, 为了维持同一个目标, 校准要求的输入就越来越大. 若控制器持续要求这段运动, 就可能碰到关节速度, 驱动器或电机的实际限额.

对机械臂来说, 奇异姿态就是所有关节贡献合起来, 也少了某个独立的任务方向. 例如平面两连杆机械臂完全伸直时, 小幅旋转关节只能产生横向的瞬时速度, 沿手臂方向的瞬时伸展能力降为零. 对应到矩阵, 就是 $J$ 的列能够张成的空间维数下降.

如果某个任务方向 $\vec e$ 与所有关节贡献都垂直, 那么 $J^{\mathsf T}\vec e=0$, 接着 $JJ^{\mathsf T}\vec e=0$. 所以校准矩阵也会失去这个方向, 无法整体求逆.

当例子里的 $\varepsilon$ 恰好为零, 伪逆会先把目标投到剩余的可达方向:

$$ J_0^+\vec v=\begin{bmatrix}v_1\\ 0\\ 0\end{bmatrix}, \qquad J_0(J_0^+\vec v)=\begin{bmatrix}v_1\\ 0\end{bmatrix}. $$

接近零时, 为了实现第二个目标分量, 输入可能非常大; 恰好为零时, 这个分量被投影舍去. 实际控制需要把这种变化处理得平滑一些.

11.3 用阻尼限制过大的输入

一个自然的想法是: 在追踪目标的同时, 也给大关节速度增加代价. 写成

$$ F(\vec x)=|J\vec x-\vec v|^2+\mu|\vec x|^2, \qquad \mu>0. $$

这样, 算法会在“末端误差”和“输入太大”之间作出取舍. 这就是阻尼最小二乘, Damped Least Squares, 的思路.

仍然按先校准, 后展开的方式处理, 得到

$$ \boxed{ \vec x_\mu =J^{\mathsf T}(JJ^{\mathsf T}+\mu I)^{-1}\vec v }. $$

这里加上的 $\mu I$, 让原本接近零的响应也带上一个正的校准尺度. 在刚才的 $\varepsilon$ 方向上, 整个输入增益从 $1/\varepsilon$ 变为

$$ \frac{\varepsilon}{\varepsilon^2+\mu}. $$

当 $\varepsilon^2$ 远大于 $\mu$ 时, 它接近原来的 $1/\varepsilon$; 当 $\varepsilon$ 趋向零时, 它会平滑地趋向零. 由 $(|\varepsilon|-\sqrt\mu)^2\ge0$, 还能得到这个增益的绝对值最多为 $1/(2\sqrt\mu)$, 因此大输入受到了限制.

代价也能直接算出: 这个方向实际实现的输出, 是目标的 $\varepsilon^2/(\varepsilon^2+\mu)$ 倍. 阻尼增大, 关节速度会减小, 末端与目标的差距则会增加. 若阻尼设得太大, 即使姿态正常, 机械臂也可能表现得很迟缓.

最后补上这个公式与目标函数的对应, 仍然只需基本运算. 记 $\vec\lambda=(JJ^{\mathsf T}+\mu I)^{-1}\vec v$, $\vec x_\mu=J^{\mathsf T}\vec\lambda$, 就有 $\vec v-J\vec x_\mu=\mu\vec\lambda$. 给输入增加任意一段 $\vec h$, 展开平方, 交叉项相互抵消, 留下

$$ F(\vec x_\mu+\vec h)-F(\vec x_\mu) =|J\vec h|^2+\mu|\vec h|^2. $$

这说明任何非零的额外改动都会增加代价. 校准表也始终可逆, 因为

$$ \langle\vec\lambda,(JJ^{\mathsf T}+\mu I)\vec\lambda\rangle =|J^{\mathsf T}\vec\lambda|^2+\mu|\vec\lambda|^2, $$

非零的 $\vec\lambda$ 会使右侧严格大于零.

另外还有 Levenberg-Marquardt, LM 算法. 把末端位置误差在当前姿态附近作线性近似, 就可以用类似的阻尼最小二乘求一小步关节更新; 算完这一小步, 再检查实际误差, 调整阻尼并继续迭代. LM 正是把这样的带阻尼局部求解组织成非线性最小二乘迭代的一类方法, 具体还会安排步长尺度与更新的接受规则. 可进一步参见 Ceres Solver 对 LM 的介绍.

从这里再去看两个满秩伪逆公式, 就可以直接读出各自的动作了: 高维测量先降维过滤, 后校准坐标; 低维目标先校准权重, 后升维分配. 每个因子都对应一项具体工作, 乘法顺序也就顺着这些工作的先后确定下来.

参考

  1. 吴进远, “如何从天降鸟粪理解穆尔-彭罗斯广义逆? | N 文粗通线性代数”, 返朴. 第 9 节采用其中落点模型的核心矩阵, 说明两个最小化选择如何同时出现.
  2. “对矢量基变换与坐标变换的一致理解”. 沿用矢量与坐标的区分, 以及通过基下的映射关系理解坐标变换的视角.
  3. UCR “Topics from linear algebra” 中的超平面定义. 本文用“子空间”描述一般嵌入, 维数恰比所在空间低一维时称为超平面.

Footnotes

  1. AIGC Note: 本文由 GPT-6.1 Sol 撰写, 羽流弦ノ迹 指导/编辑/审校. 启发式讲解思路由 羽流弦ノ迹 与 Gemini 3.6 Flash 的研讨得到. ↩