Part I · 第 1 章 线性代数 · 1.13

最小二乘与伪逆

真实的数据总是又多又脏:方程比未知数多,谁也没法全部满足。那就换一个问题:让总的平方误差最小。几何上,这就是把数据向量投影到列空间上,找最近的那一点。反过来,如果方程不够、解有无穷多,就挑最短的那个。伪逆用同一个公式 \(A^{+} = V\Sigma^{+}U^\top\) 把这两种情形一起解决,再加一点“阻尼”,机械臂就能平稳地走过奇异位形。

约 35 分钟 前置:1.6 逆、秩与零空间 · 1.9 投影 · 1.12 SVD 5 个交互

    1为什么机器人需要它

    机器人拿到的数据几乎从来不是“刚刚好”的。激光雷达扫过一面墙,返回两百个带噪声的点,而一条直线只有两个参数(斜率和截距)。轮子转了几千圈的里程日志,只为估计一个数:轮半径。标定陀螺仪的零偏和比例、相机内参、手眼关系,都要拿几十组测量去定几个未知数。

    这时方程比未知数多得多,而且每个方程都带着噪声,没有任何一个解能同时满足所有方程。我们能做的,是找一个“最不坏”的折中。这就是最小二乘 (least squares)。

    反方向的情况同样常见:一台 7 自由度机械臂只需要满足 6 个末端约束,多出来的那个自由度让关节速度有无穷多种选择。我们得有一个规则来挑,比如“关节动得最少”。再加上第三种麻烦:靠近奇异位形时,精确的逆会把微小的误差放大成巨大的关节速度(1.12 节),需要给逆加上“阻尼”。

    情形 方程数 m 与未知数 n 怎么办 机器人里的例子
    超定 (overdetermined) \(m > n\) 没有精确解:最小化总平方误差 拟合墙面直线,标定传感器,估计轮半径
    欠定 (underdetermined) \(m < n\) 无穷多解:取最短(最小范数)的一个 冗余机械臂的速度级逆运动学
    病态 (ill-conditioned) \(m = n\),但 \(\sigma_{\min}\approx 0\) 精确逆会放大噪声:加阻尼 手臂接近伸直时的逆运动学

    三种情形用的是同一件工具:伪逆 (pseudo-inverse) \(A^{+}\)。它把本章的几位主角串了起来:列空间 (1.6 节)、投影 (1.9 节)、奇异值分解 (1.12 节)。

    2直觉:无法全部满足,就让总的“错过”最小

    先看最小的例子。平面上有三个点 \((-1,\,1)\)、\((0,\,0)\)、\((1,\,2)\),想找一条直线 \(y = mt + c\) 穿过它们。每个点给一个方程:

    $$ \underbrace{\begin{bmatrix} -1 & 1 \\ 0 & 1 \\ 1 & 1 \end{bmatrix}}_{A}\underbrace{\begin{bmatrix} m \\ c \end{bmatrix}}_{\mathbf x} = \underbrace{\begin{bmatrix} 1 \\ 0 \\ 2 \end{bmatrix}}_{\mathbf b} $$

    前两行说 \(c = 0\)、\(m = -1\),第三行却要求 \(m + c = 2\)。矛盾:这三个点不共线,任何直线都会“错过”其中某些点。在 1.6 节的语言里,\(\mathbf b\) 不在 \(A\) 的列空间里。

    既然不可能全部满足,就换一个问题:让每个点的偏差,也就是残差 (residual) \(r_i = y_i - (mt_i + c)\),合起来尽量小。怎么把几个残差合成一个数?取平方和。为什么是平方?

    • 大偏差被重罚。偏差翻倍,代价翻四倍,所以一个大错比很多小错更要紧。
    • 平方是光滑的。最小值可以用求导或者几何直接解出,不需要迭代。
    • 它就是长度的平方。残差向量的平方和是 \(\|\mathbf r\|^2\),最小化它就是找最近的点,而最近点由垂线给出 (1.9 节)。
    • 它对应高斯噪声下的最大似然(4.6 节会看到)。
    核心洞见

    当 \(A\mathbf x = \mathbf b\) 无解,说明 \(\mathbf b\) 够不到 \(A\) 的列空间。最小二乘就是在列空间里找离 \(\mathbf b\) 最近的点 \(A\hat{\mathbf x}\),也就是 \(\mathbf b\) 在列空间上的投影。残差 \(\mathbf b - A\hat{\mathbf x}\) 垂直于整个列空间。

    3动手玩:用一条线拟合带噪声的点

    下图里 8 个点是带噪声的测量(比如激光雷达打在一面斜墙上)。两个琥珀色手柄决定你的直线 \(y = mt + c\)。每个点到直线的竖直线段是它的残差,以残差为边长画出的红色方块,面积就是残差的平方。所有方块面积之和就是 SSE (sum of squared errors)。你的任务只有一个:让红色的总面积尽量小。点也可以拖动。

    FIG 1最小化红色方块的总面积
    横轴 t,纵轴 y
    琥珀色:你的直线。紫色虚线:最小二乘 (LS) 直线,用右下方的按钮显示。十字是数据的重心 \((\bar t,\bar y)\)。下方的公式是由这些点直接算出的“正规方程”,本节后面会推导它。青色虚线是 TLS 线(量垂直距离而不是竖直距离),见误区 3。
    试一试
    • 只用手柄,把你的 SSE 压到最优 SSE 的 105% 以内。
    • 点“加离群点”,看最小二乘线被拉偏多少(读数会显示)。一个坏点就能把整条线拖走,因为平方让大误差占了主导。鲁棒损失见 6.9 节,RANSAC 见第三部分 11.5 节。
    • 造一条很差的线,让残差之和 \(\sum r_i\) 接近 0(\(|\sum r_i| < 1\)),同时 SSE 至少是最优的 2 倍。提示:直线必须经过哪个点?零和说明不了好坏,起作用的是平方。

    玩一会儿你会发现:最优线并不是让每个方块都变小,它是让总面积最小,有的点会为大局让步。最优线一定穿过重心 \((\bar t,\bar y)\);而穿过重心的线残差之和都是零,所以零和只是必要条件。把 8 个点写成 8 行方程,就是 \(A\mathbf x\approx\mathbf b\),其中 \(A\) 的每一行是 \([\,t_i\;\;1\,]\),\(\mathbf x = (m, c)^\top\),\(\mathbf b = (y_1,\dots,y_8)^\top\)。

    4第二种视角:数据空间里的垂线

    FIG 1 的坐标是 \((t, y)\):每个数据点是平面上的一个点(“模型空间”)。现在换一个空间看同一个问题:把所有测量值排成一个向量 \(\mathbf b\),每个测量占一根坐标轴。这样整组数据就是一个点。为了能画出来,只取三个点,固定在 \(t = -1, 0, 1\) 上,于是 \(\mathbf b = (y_1, y_2, y_3)\) 是三维空间里的一个点。

    \(A\) 的两列是 \(\mathbf a_1 = (-1, 0, 1)\)(\(t\) 的取值)和 \(\mathbf a_2 = (1, 1, 1)\)(常数 1)。\(A\mathbf x = m\,\mathbf a_1 + c\,\mathbf a_2\) 是它们的线性组合,所以“能被某条直线精确解释的数据”正好是这两列张成的一张平面(列空间)。真实数据 \(\mathbf b\) 一般不在平面上,最近的点 \(A\hat{\mathbf x}\) 是它的垂足。

    拖动右图里的三个点(或者说,在左图里移动 \(\mathbf b\)),再用滑块试别的 \((m, c)\)。

    FIG 2数据空间:b、列空间与垂足
    数据空间 ℝ³(拖动旋转)
    同一组数据,模型空间(拖动三个点)
    琥珀色箭头 \(\mathbf b\);青色平面是列空间;紫色 \(A\hat{\mathbf x}\) 是垂足,它由红色 \(\hat m\,\mathbf a_1\) 和绿色 \(\hat c\,\mathbf a_2\) 两步组合而成;红色虚线是残差 \(\mathbf r\),和平面之间有直角标记。蓝点是你用滑块选的 \(A\mathbf x\),蓝色虚线的长度平方就是那条直线的 SSE。勾股定理:\(\|\mathbf b - A\mathbf x\|^2 = \|\mathbf r\|^2 + \|A\hat{\mathbf x} - A\mathbf x\|^2\),所以垂足一定最近。
    试一试
    • 拖动三个点,让它们共线(\(\|\mathbf r\| < 0.08\))。这时 \(\mathbf b\) 在 3D 图里躺在哪里?残差去哪了?
    • 用滑块把蓝点移到离 \(\mathbf b\) 最近的位置,也就是紫色的垂足(\(\|A\hat{\mathbf x}-A\mathbf x\| < 0.12\))。需要有一定的残差(\(\|\mathbf r\|^2 > 0.3\))才算数。

    垂直这件事可以写成方程。残差 \(\mathbf r = \mathbf b - A\hat{\mathbf x}\) 垂直于平面,就是同时垂直于两列:\(\mathbf a_1^\top\mathbf r = 0\),\(\mathbf a_2^\top\mathbf r = 0\)。把两个条件叠起来就是 \(A^\top(\mathbf b - A\hat{\mathbf x}) = \mathbf 0\),即正规方程 (normal equations)

    $$ A^\top A\,\hat{\mathbf x} = A^\top\mathbf b \quad\Longrightarrow\quad \underbrace{\begin{bmatrix} 2 & 0 \\ 0 & 3 \end{bmatrix}}_{A^\top A}\begin{bmatrix}\hat m\\ \hat c\end{bmatrix} = \underbrace{\begin{bmatrix} y_3 - y_1 \\ y_1 + y_2 + y_3 \end{bmatrix}}_{A^\top\mathbf b} $$ $$ \Longrightarrow\quad \hat m = \frac{y_3 - y_1}{2},\qquad \hat c = \frac{y_1 + y_2 + y_3}{3}. $$

    这里两列恰好正交(\(\mathbf a_1\cdot\mathbf a_2 = 0\)),所以 \(A^\top A\) 是对角阵:最优斜率只看两端的点,最优截距就是三个值的平均。一般情形下 \(A^\top A\) 不是对角的,但结论一样:\(\hat{\mathbf x} = (A^\top A)^{-1}A^\top\mathbf b\)。把它乘回 \(A\),就得到投影矩阵:

    $$ A\hat{\mathbf x} = P\mathbf b,\qquad P = A(A^\top A)^{-1}A^\top = \frac16\begin{bmatrix} 5 & 2 & -1 \\ 2 & 2 & 2 \\ -1 & 2 & 5 \end{bmatrix}. $$

    它正是 1.9 节的那个 \(P\):\(P^\top = P\),\(P^2 = P\),把任何数据向量压到列空间里。下面把 FIG 2 的数代进去检验:当 \(\mathbf b = (1, 0, 2)\) 时,\(P\mathbf b = (0.5, 1, 1.5)\),也就是直线 \(y = 0.5t + 1\) 在三个位置上的取值;残差 \((0.5, -1, 0.5)\) 的平方和 1.5 就是这组数据最小的 SSE。

    5第三种视角:方程不够,挑最短的解

    现在反过来:只有一个方程,却有两个未知数,\(a_1x_1 + a_2x_2 = \beta\),也就是 \(A = [\,a_1\;\;a_2\,]\),\(b = \beta\)。在 \(x_1x_2\) 平面上,所有解排成一条直线。按 1.6 节,这条线是一个特解加上零空间:\(\mathbf x = \mathbf x_p + \mathbf n\),\(\mathbf n\in\operatorname{null}(A)\)。

    该选哪一个?一个自然的规则是选离原点最近的,也就是范数最小的。如果 \(x_1, x_2\) 是两个关节的速度,这就是“让关节总共动得最少”。几何上,离原点最近的点是原点向解线作垂线的垂足,所以它垂直于零空间方向。零空间正是与每一行都垂直的向量(\(A\mathbf n = \mathbf 0\) 就是说每一行与 \(\mathbf n\) 的点积为 0),所以垂直于零空间的方向就是各行张成的方向,叫作 \(A\) 的行空间(这里就是行向量 \((a_1, a_2)\) 的方向)。最短解一定落在行空间里。这个点就是 \(A^{+}\mathbf b\)。

    拖动青色的行向量 \((a_1, a_2)\) 的箭头尖端,用滑块改 \(\beta\),再把琥珀色的点沿解线滑动,看看有没有比紫色点更短的解。

    FIG 3一个方程,两个未知数:最小范数解
    解空间 (x₁, x₂)
    琥珀色直线是所有解 \(a_1x_1 + a_2x_2 = \beta\);青色箭头是行向量 \((a_1, a_2)\),青色虚线是零空间(和行向量垂直)。紫色点是 \(\mathbf x^{+} = A^{+}\mathbf b\),紫色虚线圆以它的长度为半径,刚好与解线相切;琥珀色点 \(\mathbf q\) 是解线上任意一点,琥珀色圆更大。勾股定理:\(\|\mathbf q\|^2 = \|\mathbf x^{+}\|^2 + s^2\),其中 \(s\) 是沿零空间走的距离。
    试一试
    • 把琥珀色点沿解线拖到最短的位置(\(|s| < 0.08\))。它和紫色点重合时,圆会变成什么样?
    • 拖动行向量,让最小范数解落在 \(x_1\) 轴上(\(|x_2^{+}| < 0.06\))。这时 \(a_2\) 是多少?为什么?

    统一:奇异值分解一次说清楚

    最小二乘(方程太多)和最小范数(方程太少)看上去是两个问题,SVD 能一起解决。把 \(A = U\Sigma V^\top\) 代进 \(A\mathbf x = \mathbf b\),并换坐标:\(\mathbf y = V^\top\mathbf x\),\(\mathbf c = U^\top\mathbf b\)。因为 \(U\)、\(V\) 是正交矩阵(不改变长度),问题就拆成了互不相干的标量方程:

    \(\sigma_i\,y_i = c_i,\qquad i = 1,\dots,r\),\(\qquad 0\cdot y_i = c_i,\qquad i > r\)。

    • \(\sigma_i > 0\) 的方向:唯一合理的选择是 \(y_i = c_i/\sigma_i\),这就是“把每个方向除以 \(\sigma_i\)”。
    • \(\sigma_i = 0\)(\(i > r\))的方向,方程 \(0\cdot y_i = c_i\) 有两件事:\(c_i\) 无法被满足,这是不可避免的残差,也是 \(\mathbf b\) 垂直于列空间的那一部分(最小二乘:不管它)。同时 \(y_i\) 取什么都不影响残差,这是零空间方向,取 0 让范数最短(最小范数)。

    合起来就是 \(\mathbf x^{+} = V\Sigma^{+}U^\top\mathbf b\):非零奇异值取倒数,零奇异值忽略。同一个公式,既处理方程太多,也处理方程太少,还包括两者混合的秩亏情形。

    \(A\) 的形状与秩 问题 \(A^{+}\)
    瘦高,列满秩(\(m > n\),\(r = n\)) 超定:唯一的最小二乘解 \((A^\top A)^{-1}A^\top\)
    矮胖,行满秩(\(m < n\),\(r = m\)) 欠定:最小范数解 \(A^\top(AA^\top)^{-1}\)
    方阵,可逆(\(r = m = n\)) 恰定:普通的逆 \(A^{-1}\)
    秩亏(\(r < \min(m, n)\)) 两者混合:在所有最小二乘解里取范数最小的 \(V\Sigma^{+}U^\top\)
    冗余机械臂:伪逆之外还能加一项

    对于 \(J\dot{\mathbf q} = \dot{\mathbf x}\) 里的冗余机械臂(\(m < n\)),所有解是 \(\dot{\mathbf q} = J^{+}\dot{\mathbf x} + (I - J^{+}J)\,\dot{\mathbf q}_0\)。第一项是最小范数的特解,第二项把任意速度 \(\dot{\mathbf q}_0\) 投影到 \(J\) 的零空间上,也就是不影响末端的“自运动”(1.6 节)。可以用它同时去避障、避开关节极限。\(I - J^{+}J\) 是到零空间的投影矩阵 (1.9 节)。

    6再看数学

    问题

    给定 \(A\in\R^{m\times n}\) 和 \(\mathbf b\in\R^m\),求

    $$ \hat{\mathbf x} = \arg\min_{\mathbf x}\ \|A\mathbf x - \mathbf b\|^2 = \arg\min_{\mathbf x}\ \sum_{i=1}^{m}\big(\mathbf a_i^\top\mathbf x - b_i\big)^2, $$

    其中 \(\mathbf a_i^\top\) 是 \(A\) 的第 \(i\) 行:每一行是一次测量(一个方程)。

    推导一:垂直与正规方程

    $$ \hl{r}{\mathbf r} = \hl{b}{\cv{\mathbf b}} - \hl{Axh}{\cw{A\hat{\mathbf x}}} \;\perp\; \hl{col}{\operatorname{col}(A)} \iff A^\top\big(\mathbf b - A\hat{\mathbf x}\big) = \mathbf 0 \iff \boxed{\,A^\top A\,\hat{\mathbf x} = A^\top\mathbf b\,} $$

    “垂直于列空间”等价于“垂直于每一列”,也就是 \(\mathbf a_j^\top\mathbf r = 0\)(\(j = 1,\dots,n\));把 \(n\) 个条件叠成一个矩阵就是 \(A^\top\mathbf r = \mathbf 0\)。

    提示:把鼠标悬停在公式中的 \(\mathbf b\)、\(A\hat{\mathbf x}\)、\(\mathbf r\)、列空间上,FIG 2 会加粗对应的对象。

    推导二:令梯度为零

    展开目标函数:\(f(\mathbf x) = \|A\mathbf x - \mathbf b\|^2 = \mathbf x^\top A^\top A\,\mathbf x - 2\,\mathbf b^\top A\mathbf x + \mathbf b^\top\mathbf b\)。它是 \(\mathbf x\) 的二次函数,梯度为 \(\nabla f = 2A^\top A\,\mathbf x - 2A^\top\mathbf b\)。令梯度为零,得到同样的正规方程。这是第 3 章(梯度)和第 6 章(优化)的预告:最小二乘是最简单的优化问题,因为目标是凸二次函数,驻点就是最小值点;\(A\) 列满秩时驻点唯一,否则最小值点构成一整片(见下文)。

    唯一性与投影矩阵

    如果 \(A\) 的列线性无关(列满秩,零空间只有 \(\mathbf 0\)),\(A^\top A\) 可逆,解唯一:

    $$ \hat{\mathbf x} = (A^\top A)^{-1}A^\top\mathbf b,\qquad A\hat{\mathbf x} = P\mathbf b,\quad P = A(A^\top A)^{-1}A^\top,\quad P^\top = P,\; P^2 = P. $$

    如果列线性相关,\(A^\top A\) 不可逆,最小二乘解不唯一:\(\hat{\mathbf x} + \mathbf n\)(\(\mathbf n\in\operatorname{null}(A)\))都一样好。这时要再加一条规则,比如下面的最小范数。

    最小范数解(方程不够)

    如果 \(A\) 的行线性无关(行满秩,\(m < n\)),\(A\mathbf x = \mathbf b\) 总有解,且有无穷多个。其中范数最小的是

    $$ \hl{xp}{\cw{\mathbf x^{+}}} = A^\top(AA^\top)^{-1}\mathbf b $$ $$ \text{every solution is } \mathbf x = \mathbf x^{+} + \mathbf n,\ \ \mathbf n\in\hl{ns}{\operatorname{null}(A)},\qquad \|\mathbf x\|^2 = \|\mathbf x^{+}\|^2 + \|\mathbf n\|^2. $$

    理由:\(\mathbf x^{+} = A^\top\mathbf w\) 是行的线性组合,在行空间里;\(A\mathbf x^{+} = AA^\top(AA^\top)^{-1}\mathbf b = \mathbf b\),所以它是解。零空间里的 \(\mathbf n\) 满足 \(A\mathbf n = \mathbf 0\),即与每一行都垂直,所以行空间和零空间互相垂直(第 5 节开头已说明),勾股定理成立,任何别的解都更长。这就是 FIG 3 里的直角。

    提示:悬停 \(\mathbf x^{+}\) 或零空间,FIG 3 会加粗对应的点或直线。

    Moore–Penrose 伪逆

    $$ A = U\Sigma V^\top \;\Longrightarrow\; A^{+} = V\,\Sigma^{+}\,U^\top,\qquad \Sigma^{+} = \operatorname{diag}\!\Big(\tfrac{1}{\sigma_1},\dots,\tfrac{1}{\sigma_r},0,\dots,0\Big)^{\!\top} $$ $$ \mathbf x^{+} = A^{+}\mathbf b = \sum_{i=1}^{r}\frac{\mathbf u_i^\top\mathbf b}{\sigma_i}\,\mathbf v_i. $$

    \(\mathbf x^{+} = A^{+}\mathbf b\) 是所有使 \(\|A\mathbf x - \mathbf b\|\) 最小的 \(\mathbf x\) 里范数最小的那个(推导见第 5 节的拆分)。几个常用事实:

    • \(AA^{+}\) 是到列空间的投影,\(A^{+}A\) 是到行空间的投影。列满秩时 \(AA^{+} = P\)。
    • 四个 Penrose 条件:\(AA^{+}A = A\),\(A^{+}AA^{+} = A^{+}\),\((AA^{+})^\top = AA^{+}\),\((A^{+}A)^\top = A^{+}A\)。满足它们的 \(A^{+}\) 是唯一的。
    • 列满秩时,\((A^\top A)^{-1}A^\top = V\Sigma^{-2}V^\top\cdot V\Sigma U^\top = V\Sigma^{-1}U^\top\),与 SVD 公式一致。行满秩时同理。

    阻尼最小二乘 (DLS)

    小奇异值是麻烦的来源:\(1/\sigma_i\) 把噪声放大。阻尼的想法是同时惩罚解的大小,让“准确”和“别太大”折中:

    $$ \min_{\mathbf x}\ \|A\mathbf x - \mathbf b\|^2 + \lambda^2\|\mathbf x\|^2 \;\Longrightarrow\; \mathbf x_\lambda = (A^\top A + \lambda^2 I)^{-1}A^\top\mathbf b = \sum_{i}\hl{dls}{\frac{\sigma_i}{\sigma_i^2 + \lambda^2}}\,(\mathbf u_i^\top\mathbf b)\,\mathbf v_i. $$

    第一个等号的推导很简洁:这等价于一个普通的最小二乘问题,只是在方程后面多叠了 \(n\) 个方程 \(\lambda\mathbf x\approx\mathbf 0\):\(\begin{bmatrix}A\\ \lambda I\end{bmatrix}\mathbf x\approx\begin{bmatrix}\mathbf b\\ \mathbf 0\end{bmatrix}\)。对它写正规方程,立刻得到 \((A^\top A + \lambda^2 I)\mathbf x = A^\top\mathbf b\)。\(A^\top A + \lambda^2 I\) 的特征值都不小于 \(\lambda^2\),所以永远可逆。统计里这叫岭回归 (ridge),反问题里叫 Tikhonov 正则化。

    在 SVD 坐标里,每个方向的增益从 \(1/\sigma\) 换成了 \(\sigma/(\sigma^2+\lambda^2)\)(悬停公式里的这一项):

    • \(\sigma\gg\lambda\):增益 \(\approx 1/\sigma\),几乎不受影响。
    • \(\sigma\ll\lambda\):增益 \(\approx\sigma/\lambda^2\to 0\),微弱的方向被安静地放弃,不再放大噪声。
    • 增益最大值是 \(1/(2\lambda)\)(在 \(\sigma = \lambda\) 处),所以 \(\lambda\) 直接决定了最坏情况下的放大倍数。

    代价是不再精确:沿弱方向的目标只完成了一部分,残差变大。\(\lambda\) 越大,解越小、残差越大;\(\lambda\to 0\) 回到伪逆。把 \(A = J\)、\(\mathbf x = \dot{\mathbf q}\)、\(\mathbf b = \dot{\mathbf x}\) 代入,就是逆运动学里的 DLS。还有一个等价的写法 \(\dot{\mathbf q} = J^\top(JJ^\top + \lambda^2 I)^{-1}\dot{\mathbf x}\),当任务维数 \(m\) 比关节数 \(n\) 小时,要求逆的矩阵更小。

    FIG 4阻尼:增益曲线与准确度–大小折中
    设 \(J = U\,\mathrm{diag}(\sigma_1,\sigma_2)\,V^\top\),\(\sigma_1 = 1\),\(\sigma_2\) 是可调的“弱方向”,目标末端速度 \(\dot{\mathbf x}\) 在 \(\mathbf u_1,\mathbf u_2\) 上的分量是 \((0.8,\,0.6)\)。左图:每个方向的增益。红色虚线是 \(1/\sigma\),紫色是 \(\sigma/(\sigma^2+\lambda^2)\);竖线标出两个奇异值(琥珀色 \(\sigma_1\),青色 \(\sigma_2\)),圆点是它们此刻的增益。右图:随着 \(\lambda\) 从 0 增大,关节速度 \(\|\dot{\mathbf q}\|\)(纵轴)和跟踪误差 \(\|J\dot{\mathbf q}-\dot{\mathbf x}\|\)(横轴)怎么变化;绿色方框是“速度 ≤ 4 且误差 ≤ 0.5”的可接受区。
    试一试
    • 保持 \(\sigma_2\) 在 0.04 到 0.08 之间,调 \(\lambda\),让关节速度 \(\|\dot{\mathbf q}\|\le 4\) 同时跟踪误差 \(\le 0.5\)。\(\lambda = 0\) 时关节速度是多少?

    加权最小二乘

    前面默认每个测量一样可靠。如果第 \(i\) 个测量的噪声标准差是 \(s_i\),就该让可靠的测量说话更响:最小化 \((A\mathbf x - \mathbf b)^\top W(A\mathbf x - \mathbf b)\),\(W = \operatorname{diag}(1/s_i^2)\),解为

    $$ \hat{\mathbf x} = (A^\top W A)^{-1}A^\top W\,\mathbf b. $$

    做法等价于先把每一行和每个 \(b_i\) 除以 \(s_i\)(“白化”),再解普通的最小二乘。更一般地,\(W\) 取噪声协方差的逆,这正是 4.6 节的最大似然和 4.8 节卡尔曼滤波里反复出现的形式。

    7机器人中的它:穿过奇异位形的速度级逆运动学

    让平面两连杆机械臂(和 1.12 节的同一台,\(\ell_1 = 1.2\),\(\ell_2 \approx 0.85\))的末端去追一个目标点。每一帧:

    1. 想要的末端速度 \(\dot{\mathbf x} = K(\mathbf x_{\text{target}} - \mathbf x)\)(朝目标走,限制最大速度)。
    2. 解 \(J(\mathbf q)\,\dot{\mathbf q} = \dot{\mathbf x}\),得到关节速度 \(\dot{\mathbf q}\)。解法有三种:逆 \(J^{-1}\);伪逆,把 \(\sigma_i<0.08\) 的方向直接丢弃;阻尼 DLS,增益 \(\sigma/(\sigma^2+\lambda^2)\)。
    3. 真实电机有速度上限,所以每个关节速度被截到 \(\pm 6\) rad/s,然后更新 \(\mathbf q \leftarrow \mathbf q + \dot{\mathbf q}\,\Delta t\)。

    拖动紫色目标点。用快捷按钮把目标放到工作空间的边缘之外,或者放进靠近底座的“洞”里(外圈和内圈都是奇异位形,1.12 节),换着三种解法看。右侧的条形图是解法要求的关节速度(截断之前),虚线是电机上限;下方曲线是过去 4 秒里的最大需求。

    FIG 5追目标:逆、伪逆还是阻尼?
    要求的最大关节速度(rad/s),过去 4 秒
    琥珀色椭圆是当前姿态的可操作度椭圆(1.12 节)。末端的紫色短箭头是想要的速度 \(\dot{\mathbf x}\),青色短箭头是截断之后实际得到的速度 \(J\dot{\mathbf q}\):两者方向不同,说明关节速度被截断后“跑偏”了。靠近奇异位形时 \(\sigma_2\to 0\),\(J^{-1}\) 要求的速度趋于无穷,截断后手臂左右抖动;伪逆的增益在阈值附近从 \(1/0.08 = 12.5\) 直接跳到 0:跳之前要求的速度仍会冲过电机上限,跳之后沿弱方向的运动戛然而止,而不是逐渐减速;阻尼解法的增益连续变化,手臂平滑地伸向极限。
    试一试
    • 选阻尼解法,把目标拖到外圈附近(离底座不超过约 2.35,“边缘外 (2.1)”按钮就可以),让手臂平滑地伸到几乎伸直(末端到底座的距离 \(\ge 1.97\))并停稳,过去 4 秒内要求的关节速度没有超过 6 rad/s(看下方曲线)。
    • 选逆解法,把目标放到工作空间之外,看要求的关节速度飙到 \(\ge 30\) rad/s(超过电机上限 5 倍)。再换成阻尼,对比有多平静。

    注意一个细节:对可达的目标,逆在边缘附近也能工作,因为越靠近目标,想要的速度越小,\(\dot{\mathbf x}/\sigma_2\) 才没有爆炸。真正出问题的是目标在可达范围之外,或者目标本身在高速掠过奇异方向:此时需要的是“沿弱方向走一大步”,而弱方向的增益正是 \(1/\sigma_2\)。阻尼解法对两种情形都有效,代价是在奇异方向上反应变慢(滞后)。

    真实系统里:标定就是一个大最小二乘

    传感器的比例和零偏:测量 \(z_k = s\,u_k + o\),每次测量一行 \([\,u_k\;\;1\,]\,(s, o)^\top = z_k\)。这就是 FIG 1 的直线拟合。轮半径:每段日志有 \(d_k = r\,\varphi_k\)(位移 = 半径 × 转角),一个未知数,\(\hat r = \sum\varphi_k d_k / \sum\varphi_k^2\)。手眼标定 \(AX = XB\):旋转部分 \(R_{A_i}R_X = R_XR_{B_i}\) 可以化成两组旋转轴之间的对齐问题,用 SVD 求解;平移部分 \((R_{A_i} - I)\,\mathbf t_X = R_X\mathbf t_{B_i} - \mathbf t_{A_i}\) 对 \(\mathbf t_X\) 是线性的,把每次运动的 3 行叠起来,得到一个 \(3N\times 3\) 的最小二乘问题。必须有至少两次旋转轴不平行的运动,否则叠出来的矩阵秩亏(用 1.12 节的奇异值检查)。

    真实系统里:怎么选 λ

    固定的 \(\lambda\) 在远离奇异位形时也在白白降低精度。常见做法是让 \(\lambda\) 随 \(\sigma_{\min}\) 变化:\(\sigma_{\min}\) 大于阈值 \(\epsilon\) 时 \(\lambda = 0\),小于 \(\epsilon\) 时取 \(\lambda^2 = \lambda_{\max}^2\,(1 - \sigma_{\min}^2/\epsilon^2)\),这是一种常见的自适应阻尼方案。数值逆运动学库里常带有类似的阻尼项,例如 KDL 的加权阻尼最小二乘速度求解器。

    8常见误区

    误区 1:直接解正规方程就行

    教材里的 \((A^\top A)^{-1}A^\top\mathbf b\) 适合推导,不适合写代码。构造 \(A^\top A\) 会把条件数平方:\(\kappa(A^\top A) = \kappa(A)^2\)。比如用时间戳 \(t = 1000, 1002,\dots,1010\) 拟合 \(y = mt + c\),\(\kappa(A)\approx 3\times10^{5}\),\(\kappa(A^\top A)\approx 9\times10^{10}\),双精度的 16 位有效数字丢掉约 11 位。实际用 QR 分解或 SVD(np.linalg.lstsq、Eigen 的 BDCSVD、colPivHouseholderQr),它们直接对 \(A\) 操作,1.12 节的“实际怎么算”说的是同一个道理。

    误区 2:最小二乘对坏数据很宽容

    恰恰相反。残差被平方,一个离群点的影响和它偏差的平方成正比,FIG 1 里加一个离群点就能把整条线拖偏。激光里的反射错误、特征匹配的误匹配都是离群点。对策是鲁棒损失(Huber、Cauchy)或者先用 RANSAC 挑出内点再拟合,分别见 6.9 节和 11.5 节。

    误区 3:它最小化的是点到线的距离

    普通最小二乘最小化的是竖直距离 \(y_i - (mt_i + c)\),默认 \(t\) 是准确的,只有 \(y\) 带噪声。如果 \(t\) 和 \(y\) 都有噪声,比如两个坐标都来自激光点,就该最小化垂直距离,这叫总体最小二乘 (total least squares, TLS),解是点云的主方向,用 1.12 节的 PCA 即可。FIG 1 里打开 TLS 线,把点拉成近乎竖直的一列,两条线差得很远;对竖直的墙,普通最小二乘还会得到斜率无穷大。

    误区 4:列的尺度无所谓

    如果 \(A\) 的一列以米为单位、另一列以毫米为单位(差 1000 倍),\(\kappa(A)\) 会变大几百倍:上面的 \([\,t\;\;1\,]\),\(t\in[0,1]\) 时 \(\kappa\approx 3.7\),换成毫米后 \(\kappa\approx 1100\)。手眼标定里旋转(无量纲)和平移(米或毫米)经常混在一个系统里,也是同样的问题。对策:把每一列除以它的范数(列归一化)、把数据减去均值再拟合,求完解再换回原来的单位。

    误区 5:阻尼系数越大越安全

    \(\lambda\) 太小,奇异位形附近的增益峰值 \(1/(2\lambda)\) 还是很高,关节速度抖动。\(\lambda\) 太大,所有方向的增益都被压低,末端跟不上目标,手臂变得迟钝,甚至在远离奇异的地方也停滞。FIG 4 右图就是这个折中。折中点取决于电机速度上限和你能容忍的跟踪误差,常需要实验调参,或者用上面“随 \(\sigma_{\min}\) 变化”的自适应方案。

    9小练习

    1. 三个点 \((-1,\,1)\)、\((0,\,1)\)、\((1,\,4)\) 的最小二乘直线 \(y = mt + c\) 是?
    这三个点的 \(t\) 值是 \(-1, 0, 1\),和 FIG 2 一样两列正交:\(\hat m = (y_3 - y_1)/2 = 1.5\),\(\hat c = (y_1 + y_2 + y_3)/3 = 2\)。残差是 \((0.5, -1, 0.5)\),SSE = 1.5。过两端的点那条线 SSE = 2.25,\(y = 2\) 是 6,\(y = 1.5t + 1\) 是 4.5,都更大。
    2. 一个方程 \(x_1 + 2x_2 = 5\),两个关节速度未知。最小范数解是?
    四个选项都满足方程,区别在长度:\(\mathbf x^{+} = A^\top(AA^\top)^{-1}b = (1,2)\cdot 5/5 = (1,2)\),\(\|\mathbf x\|^2 = 5\)。其余三个的 \(\|\mathbf x\|^2\) 分别是 25、10、6.25。最小范数解沿着行向量 \((1,2)\) 的方向,垂直于零空间 \((2,-1)\)。
    3. 在最小二乘解 \(\hat{\mathbf x}\) 处,残差 \(\mathbf r = \mathbf b - A\hat{\mathbf x}\) 一定满足哪一条?
    这就是正规方程 \(A^\top\mathbf r = \mathbf 0\)。\(\mathbf r = \mathbf 0\) 只在 \(\mathbf b\) 恰好在列空间里时成立。“和为 0”只是特例:当 \(A\) 有一列全是 1(直线拟合里的截距)时,\(\mathbf 1^\top\mathbf r = 0\);没有这一列,和不必为 0。FIG 1 里零和的坏线说明这个条件远不够。
    4. 某个姿态下 \(J\) 的奇异值是 \(\sigma_1 = 1.5\),\(\sigma_2 = 0.01\),阻尼 \(\lambda = 0.1\)。DLS 在弱方向上的增益 \(\sigma_2/(\sigma_2^2 + \lambda^2)\) 约是多少(不阻尼时是 \(1/\sigma_2 = 100\))?强方向的增益呢?
    弱方向:\(0.01/(0.0001 + 0.01) = 0.99\),从 100 降到约 1。强方向:\(1.5/(2.25 + 0.01) = 0.664\),而不阻尼时是 \(1/1.5 = 0.667\)。阻尼几乎只改变弱方向,这正是想要的效果。代价:沿弱方向的目标只完成了约 \(\sigma_2\cdot 0.99 = 1\%\)。
    5. \(\kappa(A) = 10^{5}\),用双精度(约 16 位有效数字)。先算 \(A^\top A\) 再解正规方程,大约会丢掉多少位有效数字?
    \(\kappa(A^\top A) = \kappa(A)^2 = 10^{10}\),相对误差约 \(10^{10}\times10^{-16} = 10^{-6}\),只剩约 6 位,丢掉约 10 位。直接对 \(A\) 做 QR 或 SVD,误差只有约 \(\kappa\epsilon = 10^{-11}\),只丢约 5 位。

    10延伸阅读

    • G. Strang, Introduction to Linear Algebra, §4.3 — 最小二乘近似(正规方程与投影)
    • G. Strang, Introduction to Linear Algebra, Ch. 7 — SVD 与伪逆
    • G. Strang, MIT 18.06 Linear Algebra (OCW) — 第 16 讲:投影矩阵与最小二乘
    • K. Lynch & F. Park, Modern Robotics, §6.2 — 数值逆运动学(伪逆迭代)
    • S. R. Buss, “Introduction to Inverse Kinematics with Jacobian Transpose, Pseudoinverse and Damped Least Squares Methods”, 2004 — 三种雅可比方法的清晰对比,含奇异位形处的实验
    • Y. Nakamura & H. Hanafusa, J. Dynamic Systems, Measurement, and Control 108(3), 1986; C. W. Wampler, IEEE Trans. Systems, Man, and Cybernetics 16(1), 1986 — 阻尼最小二乘用于逆运动学的原始论文