Part I · 第 4 章 概率 · 4.4

高斯分布

机器人学里最常见的分布,是那条钟形曲线。它不是随便挑的:许多小误差叠加会得到它,它又有三个神奇的"封闭性":线性变换之后还是高斯,切一刀(条件化)还是高斯,两个相乘还是高斯。卡尔曼滤波的全部数学,就是反复用这几条性质。这一节把它从一维讲到多维,并且用眼睛把条件化与乘积看明白。

约 30 分钟 前置:4.3 期望、方差与协方差 · 1.6 逆 · 1.11 特征值 5 个交互

    1为什么机器人需要它

    想象要用一个分布来描述"机器人在哪"。直方图要存很多格子,粒子要存很多点,而高斯分布只需要两个量:均值和协方差。三维位姿加上速度,也不过是一个向量加一个小矩阵。这让它成为状态估计里最"便宜"的信念表示。

    便宜之外,它还有三条"封闭性",它们是卡尔曼滤波能精确运算的原因:

    • 线性变换封闭:高斯过一个线性映射 \(A\mathbf x + \mathbf b\) 还是高斯(4.5 节:预测步);
    • 条件化封闭:已知一部分变量的取值,其余变量的分布还是高斯(本节 FIG 4);
    • 乘积封闭:两个高斯相乘,再归一化,还是高斯(本节 FIG 5:更新步,融合两个传感器)。

    再加上"中心极限定理":许多独立的小误差叠加,总是趋向高斯,所以传感器噪声常常真的近似高斯。这并不是巧合,也不是数学上的便利而已。

    2直觉:一条由 μ 和 σ 决定的钟形曲线

    一维高斯 \(\mathcal N(\mu, \sigma^2)\) 只有两个旋钮:均值 \(\mu\) 决定钟的位置,标准差 \(\sigma\) 决定它有多胖。因为总面积恒为 1,钟变胖就必须变矮,变瘦就必须变高。

    它最值得记住的性质是"68–95–99.7 规则":落在 \(\mu \pm \sigma\) 内的概率约 68%,\(\mu \pm 2\sigma\) 内约 95%,\(\mu \pm 3\sigma\) 内约 99.7%。所以"\(\pm 3\sigma\) 之外"几乎不会发生,一个读数偏离这么远,十有八九是出了故障或遇到了离群点。拖动图中的两个手柄,再拖动带宽 \(k\)。

    FIG 1一维高斯与 68–95–99.7
    拖动底部圆点改变 \(\mu\),拖动曲线腰部的圆点改变 \(\sigma\)。黄色阴影是 \(\mu \pm k\sigma\) 内的面积;下方的紫点是 300 个抽样,落在带内的点用实心显示,带外的为空心。
    试一试
    • 把 \(\sigma\) 压到 0.5 以下,看峰值涨到约 0.8:面积不变,所以瘦了就要高。
    • 令 \(k = 1\)、\(2\)、\(3\):面积依次是 68.3%、95.4%、99.7%,实心点的比例也跟着变。
    • 找到使面积恰为 95% 的 \(k\)(约 1.96):这就是 "95% 置信区间 = 均值 ± 1.96σ" 的来历。

    为什么到处都是高斯:中心极限定理

    取很多个独立的随机变量相加,不管每个单独长什么样(只要方差有限),它们的和(标准化之后)的分布,会越来越像高斯。传感器的总噪声,往往是电路热噪声、量化误差、微小震动……几十个小来源叠加的结果,于是常常近似高斯。下面选一个"完全不像高斯"的来源,看它怎样被"加"成钟形。

    FIG 2中心极限定理:把 k 个变量加起来
    青色柱子是 4000 次实验中"\(k\) 个独立变量之和(减去均值、除以 \(\sqrt{k}\,\sigma\))"的直方图,黄色曲线是标准高斯。"最大差距"是经验分布函数与高斯 CDF 的最大差(Kolmogorov 距离),越小越像。"硬币"之和只能取间隔 \(2/\sqrt{k}\) 的离散值,所以每个取值画一根柱,柱高 = 该取值的概率 ÷ 间隔(这样才能和密度曲线比较)。它的经验分布函数是台阶,"最大差距"因此不会低于最高那级台阶的一半。小图是单个变量自己的分布。
    试一试
    • 选"硬币"(只取 ±1,两个尖峰):\(k = 1\) 时是两根针,把 \(k\) 加到 10 以上,针的顶端连起来就贴着钟形曲线。
    • 选"指数"(明显偏斜):把 \(k\) 加到 12 以上,偏斜才大体消失。偏斜得越厉害的来源,需要的 \(k\) 越大。

    3动手玩:二维高斯与马氏距离

    二维(以及更高维)高斯的"等高线"是同心椭圆,椭圆的形状正是协方差矩阵(4.3 节)。密度只依赖于一个量:到均值的马氏距离 (Mahalanobis distance)

    \(d_M(\mathbf p) = \sqrt{(\mathbf p - \boldsymbol\mu)^\top \Sigma^{-1} (\mathbf p - \boldsymbol\mu)}\)

    它是"按各方向的标准差来量的距离":沿着不确定性大的方向,同样的欧氏距离算"近";沿着不确定性小的方向,算"远"。把 \(\Sigma\) 拿掉,它就是普通的欧氏距离。一个点是否"反常",要看马氏距离,而不是欧氏距离。

    拖动图中的均值、两个主轴把手,再拖动那个测试点 \(\mathbf p\):对比欧氏距离与马氏距离。

    FIG 3椭圆等高线与马氏距离
    500 个样本;黄色椭圆是 \(d_M = 1, 2, 3\);两个黄色把手在 1σ 椭圆的轴端,圆心也可拖。紫色测试点 \(\mathbf p\) 与均值之间的虚线表示欧氏距离,穿过 \(\mathbf p\) 的紫色椭圆是它所在的等高线。右侧表格:落在各等高线内的样本比例,与理论值 \(1 - e^{-r^2/2}\) 对比。
    试一试
    • 找一个点:欧氏距离 ≥ 1.8,马氏距离却 ≤ 1(沿着长轴方向走)。
    • 再找一个点:欧氏距离 ≤ 1,马氏距离却 ≥ 2(沿着短轴方向)。
    2σ 椭圆不是 95%

    看右侧表格:二维里 \(d_M \le 1\) 的概率只有 39.3%,\(d_M \le 2\) 是 86.5%,要到 \(d_M \le 3\) 才是 98.9%。想要 95% 的椭圆,半径是 \(r = \sqrt{5.99} \approx 2.45\)。原因是维度越高,概率"外溢"得越多(\(d_M^2\) 服从自由度为 2 的卡方分布,它的 CDF 是 \(1 - e^{-r^2/2}\))。

    4第二个视角:边缘化与条件化

    对一个联合高斯 \(p(x, y)\),有两种"降维":

    • 边缘化:忘掉 \(y\),只看 \(x\)。几何上是把点云投影到 \(x\) 轴;结果还是高斯,均值与方差直接取原来的那一项:\(x \sim \mathcal N(\mu_x, \sigma_x^2)\),与 \(\rho\) 无关。
    • 条件化:已知 \(x = x_0\),问 \(y\) 的分布。几何上是在 \(x = x_0\) 处切一刀,看这条细缝里点的分布;结果还是高斯,但均值会沿着相关性移动,方差会变小。

    条件化的方差比边缘分布小,而且不依赖于 \(x_0\) 的具体取值,只取决于相关性有多强:\(\sigma_{y|x}^2 = \sigma_y^2(1 - \rho^2)\)。这正是 4.8 节"只测位置,速度也变准"的原因:测量就是条件化。

    FIG 4投影(边缘)与切片(条件)
    3000 个样本。上方和右侧的青色曲线是边缘分布 \(p(x)\)、\(p(y)\)(点云的投影)。拖动底部的黄色圆点设置 \(x_0\):竖线右边的黄色曲线是条件分布 \(p(y \mid x = x_0)\),青色细柱是竖线两侧窄带内真实样本的直方图,用来验证曲线。
    试一试
    • 令 \(\rho \ge 0.8\):条件分布的宽度缩到边缘分布的 60% 以下。相关越强,知道 \(x\) 越能帮你猜 \(y\)。
    • 保持 \(\rho \ne 0\),把 \(x_0\) 拖到一侧,使条件均值偏离 0 超过 1:条件均值沿着"回归线"移动。
    • 令 \(\rho = 0\):条件分布与边缘分布完全重合,知道 \(x\) 对 \(y\) 毫无帮助(独立)。

    5再看数学

    提示:悬停带底色的符号,FIG 3、FIG 4、FIG 5 里对应的几何会高亮。

    密度

    $$ \mathcal N(x;\,\mu, \sigma^2) = \frac{1}{\sqrt{2\pi}\,\sigma}\exp\!\Big(-\frac{(x-\mu)^2}{2\sigma^2}\Big) $$ $$ \mathcal N(\mathbf x;\,\boldsymbol\mu, \Sigma) = \frac{1}{(2\pi)^{n/2}\,|\Sigma|^{1/2}}\exp\!\Big(-\tfrac12\,\hl{dM}{(\mathbf x-\boldsymbol\mu)^\top \Sigma^{-1} (\mathbf x-\boldsymbol\mu)}\Big) $$

    指数里那一项就是马氏距离的平方 \(d_M^2\)。等高线 \(d_M = r\) 是椭圆,主轴沿 \(\Sigma\) 的特征向量(1.11),半轴长 \(r\sqrt{\lambda_i}\)。\(n\) 维时 \(d_M^2\) 服从自由度为 \(n\) 的卡方分布;\(n = 2\) 时 \(P(d_M \le r) = 1 - e^{-r^2/2}\)。前面的系数只是让总积分为 1,\(|\Sigma|\) 越大(椭圆越"大"),峰越低。

    三条封闭性

    把向量分成两块 \(\mathbf x = (\mathbf a, \mathbf b)\),均值与协方差也分块:

    $$ \begin{bmatrix}\mathbf a\\ \mathbf b\end{bmatrix} \sim \mathcal N\!\left(\begin{bmatrix}\boldsymbol\mu_a\\ \boldsymbol\mu_b\end{bmatrix},\; \begin{bmatrix}\Sigma_{aa} & \Sigma_{ab}\\ \Sigma_{ba} & \Sigma_{bb}\end{bmatrix}\right) $$ $$ \text{(1)}\;\; A\mathbf x + \mathbf c \sim \mathcal N(A\boldsymbol\mu + \mathbf c,\; A\Sigma A^\top) \qquad\text{(2)}\;\; \hl{marg}{\mathbf a \sim \mathcal N(\boldsymbol\mu_a,\, \Sigma_{aa})} $$ $$ \text{(3)}\;\; \hl{cond}{\mathbf a \mid \mathbf b \sim \mathcal N\big(\boldsymbol\mu_a + \Sigma_{ab}\Sigma_{bb}^{-1}(\mathbf b - \boldsymbol\mu_b),\;\; \Sigma_{aa} - \Sigma_{ab}\Sigma_{bb}^{-1}\Sigma_{ba}\big)} $$

    (1) 在 4.5 节推导。(2) 边缘化:直接取子块,丢掉另一半(FIG 4 的投影)。(3) 条件化:均值沿 \(\Sigma_{ab}\Sigma_{bb}^{-1}\)("回归系数")移动,协方差减去一项半正定矩阵,所以只会变小,而且与 \(\mathbf b\) 的具体取值无关。二维情形下,\(\Sigma_{ab}\Sigma_{bb}^{-1} = \rho\sigma_y/\sigma_x\),方差为 \(\sigma_y^2 - \rho^2\sigma_y^2\),正是 FIG 4 的公式。

    (4) 乘积:两个关于同一个 \(\mathbf x\) 的高斯"信息"(比如两个传感器各自给出的估计)相乘,再归一化:

    $$ \mathcal N(\mathbf x; \boldsymbol\mu_1, \Sigma_1)\;\mathcal N(\mathbf x; \boldsymbol\mu_2, \Sigma_2) \;\propto\; \mathcal N(\mathbf x; \boldsymbol\mu, \Sigma) $$ $$ \hl{prod}{\Sigma^{-1} = \Sigma_1^{-1} + \Sigma_2^{-1}}, \qquad \hl{prod}{\boldsymbol\mu = \Sigma\big(\Sigma_1^{-1}\boldsymbol\mu_1 + \Sigma_2^{-1}\boldsymbol\mu_2\big)} $$

    "精度(协方差的逆)相加,均值是按精度加权的平均"。一维时就是 4.8 节「再看数学」里的公式。多维时精度是矩阵:每个方向分别按自己的精度加权,所以一个传感器擅长的方向,由它说了算(FIG 5)。把这个结果换一种写法,就是卡尔曼增益 \(K = \Sigma_1(\Sigma_1 + \Sigma_2)^{-1}\):\(\boldsymbol\mu = \boldsymbol\mu_1 + K(\boldsymbol\mu_2 - \boldsymbol\mu_1)\),\(\Sigma = (I - K)\Sigma_1\)。

    6机器人中的它:把两个传感器的估计融合起来

    一台机器人在一条长走廊里。激光扫描匹配很准地知道它离两侧墙有多远,却完全不知道自己沿走廊走到了哪里(沿走廊方向毫无特征):它的不确定性椭圆是一条沿走廊的长细条。Wi-Fi/GPS 定位在各个方向都差不多,只是粗糙,是一个大圆饼。两者的乘积,也就是融合之后的信念,会是什么样?

    答案是:垂直走廊的方向由激光说了算,沿走廊的方向由 Wi-Fi 说了算,结果是一个小得多的椭圆:垂直走廊方向和激光一样窄,沿走廊方向比 Wi-Fi 还紧,面积比任何一个传感器的都小。拖动两个椭圆,并试试"垂直的两个长条"预设。右侧给出了两个估计的分歧程度(马氏距离的平方 \(z^2\))和它的 p 值:如果两个传感器差得太远,这个 p 值会很小,说明至少有一个传感器出了问题,这正是卡尔曼滤波里"门限 (gating)"检验的原理。

    FIG 5两个高斯相乘:二维传感器融合
    青色与紫色椭圆是两个传感器各自的 2σ 估计,每个都有三个把手(中心、两个轴端)。黄色是它们的乘积,也就是融合结果。黄色椭圆总是落在两者"重叠"的区域里,并且比两者都小。
    试一试
    • 点"垂直的两个长条":每个传感器只在一个方向准,融合后的椭圆面积不到任一者的 25%。
    • 把两个中心拖开,直到 p 值低于 5%:两个传感器在"吵架",此时融合出来的东西不可信。
    真实系统里

    "一个传感器擅长的方向由它说了算",在 SLAM 和多传感器标定里无处不在:激光约束垂直方向、视觉约束朝向、GPS 约束全局位置,把它们的信息(精度)矩阵相加,就得到每个方向都有约束的完整估计。这种"信息相加"的写法叫信息滤波器 / 因子图(6.9 节)。

    7常见误区

    误区 1:多维里还是"±2σ 约 95%"

    一维里是对的,二维 2σ 椭圆只有 86.5%,三维只有 73.9%。要做"95% 置信椭圆",半径要按卡方分布查(二维约 2.45σ,三维约 2.80σ)。判断一个读数是否"合群"(gating)时,这个差别会决定你丢掉多少好数据。

    误区 2:噪声一定是高斯的

    高斯的尾巴很轻:偏离 \(5\sigma\) 的概率只有 \(6\times 10^{-7}\)。真实传感器却会有离群点(多路径、玻璃反射、误匹配),尾巴远比高斯重。直接把它们当高斯处理,一个离群点就能把估计拉走很远。对策:先做 gating 把离群点挡在外面,或使用鲁棒核函数 (Huber、Cauchy),或混合模型(4.1 节的光束模型)。多峰的信念(两扇一样的门)也无法用一个高斯表示。

    误区 3:协方差矩阵随便写

    \(\Sigma\) 必须对称、半正定;要做马氏距离或乘积,还需要它可逆(正定)。手写协方差时,非对角元素不能超过 \(\sqrt{\sigma_x^2\sigma_y^2}\)(即 \(|\rho| \le 1\))。数值误差会慢慢破坏对称性和正定性,实际代码里常对 \(\Sigma\) 做 \((\Sigma+\Sigma^\top)/2\) 对称化,或加一点很小的对角项。

    误区 4:随便把两个高斯相乘

    乘积公式的前提和 4.2 节一样:两份信息来自独立的来源。如果两个估计共用了同一批数据(比如两个滤波器都用了同一个里程计),直接相乘会重复计票,得到过度自信的结果。这种情形要用"协方差交叉 (covariance intersection)"之类保守的融合。

    误区 5:角度也当高斯

    朝向角 \(\theta\) 住在一个圆上,179° 和 −179° 其实只差 2°,普通高斯会把它们看成差 358°。小范围内把角度当高斯是个好近似;大不确定性或三维旋转要用李群上的扰动(第 5 章)。

    8小练习

    1. 一个读数服从 \(\mathcal N(10, 0.2^2)\)(单位 m)。它落在 \([9.6, 10.4]\) 内的概率约为?
    \(\sigma = 0.2\),区间是 \(\mu \pm 2\sigma\),约 95.4%。
    2. 二维高斯里,落在 \(d_M \le 2\) 的椭圆内的概率是?
    \(1 - e^{-r^2/2} = 1 - e^{-2} \approx 0.865\)。一维的 95.4% 在二维要到 \(r \approx 2.45\) 才达到 95%。
    3. \(\Sigma = \begin{bmatrix}4 & 2\\ 2 & 3\end{bmatrix}\)(先 \(x\) 后 \(y\)),\(\boldsymbol\mu = \mathbf 0\)。已知 \(x = 2\) 时,\(y\) 的条件均值和条件方差是?
    \(\Sigma_{yx}\Sigma_{xx}^{-1} = 2/4 = 0.5\),条件均值 \(= 0.5 \times 2 = 1\);条件方差 \(= 3 - 2\cdot 2/4 = 3 - 1 = 2\)。方差比边缘方差 3 小,与 \(x = 2\) 的具体值无关。
    4. 两个无偏估计,协方差分别为 \(\Sigma_1 = \mathrm{diag}(1, 4)\)、\(\Sigma_2 = \mathrm{diag}(4, 1)\)。融合(相乘)后的协方差是?
    精度相加:\(\Sigma^{-1} = \mathrm{diag}(1, 0.25) + \mathrm{diag}(0.25, 1) = \mathrm{diag}(1.25, 1.25)\),所以 \(\Sigma = \mathrm{diag}(0.8, 0.8)\),比任一输入都小,且每个方向都比两者中较好的那个还准。
    5. \(\Sigma = \mathrm{diag}(4, 1)\),均值在原点。点 \(\mathbf p = (2, 0)\) 与点 \(\mathbf q = (0, 1.5)\),哪个相对于这个高斯更"反常"?
    \(d_M(\mathbf p)^2 = 2^2/4 = 1\),\(d_M(\mathbf q)^2 = 1.5^2/1 = 2.25\)。\(x\) 方向的标准差是 2,偏 2 才只有 1σ;\(y\) 方向的标准差是 1,偏 1.5 就是 1.5σ。

    9延伸阅读

    • C. M. Bishop, Pattern Recognition and Machine Learning, Springer, 2006, Sec. 2.3 — 多元高斯的几何、条件与边缘分布、乘积,本节公式在这里有完整推导
    • S. Thrun, W. Burgard & D. Fox, Probabilistic Robotics, MIT Press, 2005, Sec. 3.2 — 高斯信念与矩参数化 / 规范参数化
    • T. D. Barfoot, State Estimation for Robotics, Cambridge University Press, 2017, Sec. 2.2 — 高斯概率密度、联合/条件/边缘、乘积与归一化
    • 3Blue1Brown, But what is the Central Limit Theorem? (video) — 用动画解释为什么叠加会得到钟形
    • R. Labbe, Kalman and Bayesian Filters in Python, Ch. 4 — 高斯分布与它们的乘积,配可运行代码