高斯分布
机器人学里最常见的分布,是那条钟形曲线。它不是随便挑的:许多小误差叠加会得到它,它又有三个神奇的"封闭性":线性变换之后还是高斯,切一刀(条件化)还是高斯,两个相乘还是高斯。卡尔曼滤波的全部数学,就是反复用这几条性质。这一节把它从一维讲到多维,并且用眼睛把条件化与乘积看明白。
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\)。
- 把 \(\sigma\) 压到 0.5 以下,看峰值涨到约 0.8:面积不变,所以瘦了就要高。
- 令 \(k = 1\)、\(2\)、\(3\):面积依次是 68.3%、95.4%、99.7%,实心点的比例也跟着变。
- 找到使面积恰为 95% 的 \(k\)(约 1.96):这就是 "95% 置信区间 = 均值 ± 1.96σ" 的来历。
为什么到处都是高斯:中心极限定理
取很多个独立的随机变量相加,不管每个单独长什么样(只要方差有限),它们的和(标准化之后)的分布,会越来越像高斯。传感器的总噪声,往往是电路热噪声、量化误差、微小震动……几十个小来源叠加的结果,于是常常近似高斯。下面选一个"完全不像高斯"的来源,看它怎样被"加"成钟形。
- 选"硬币"(只取 ±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\):对比欧氏距离与马氏距离。
- 找一个点:欧氏距离 ≥ 1.8,马氏距离却 ≤ 1(沿着长轴方向走)。
- 再找一个点:欧氏距离 ≤ 1,马氏距离却 ≥ 2(沿着短轴方向)。
看右侧表格:二维里 \(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 节"只测位置,速度也变准"的原因:测量就是条件化。
- 令 \(\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 里对应的几何会高亮。
密度
指数里那一项就是马氏距离的平方 \(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)\),均值与协方差也分块:
(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\) 的高斯"信息"(比如两个传感器各自给出的估计)相乘,再归一化:
"精度(协方差的逆)相加,均值是按精度加权的平均"。一维时就是 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)"检验的原理。
- 点"垂直的两个长条":每个传感器只在一个方向准,融合后的椭圆面积不到任一者的 25%。
- 把两个中心拖开,直到 p 值低于 5%:两个传感器在"吵架",此时融合出来的东西不可信。
"一个传感器擅长的方向由它说了算",在 SLAM 和多传感器标定里无处不在:激光约束垂直方向、视觉约束朝向、GPS 约束全局位置,把它们的信息(精度)矩阵相加,就得到每个方向都有约束的完整估计。这种"信息相加"的写法叫信息滤波器 / 因子图(6.9 节)。
7常见误区
一维里是对的,二维 2σ 椭圆只有 86.5%,三维只有 73.9%。要做"95% 置信椭圆",半径要按卡方分布查(二维约 2.45σ,三维约 2.80σ)。判断一个读数是否"合群"(gating)时,这个差别会决定你丢掉多少好数据。
高斯的尾巴很轻:偏离 \(5\sigma\) 的概率只有 \(6\times 10^{-7}\)。真实传感器却会有离群点(多路径、玻璃反射、误匹配),尾巴远比高斯重。直接把它们当高斯处理,一个离群点就能把估计拉走很远。对策:先做 gating 把离群点挡在外面,或使用鲁棒核函数 (Huber、Cauchy),或混合模型(4.1 节的光束模型)。多峰的信念(两扇一样的门)也无法用一个高斯表示。
\(\Sigma\) 必须对称、半正定;要做马氏距离或乘积,还需要它可逆(正定)。手写协方差时,非对角元素不能超过 \(\sqrt{\sigma_x^2\sigma_y^2}\)(即 \(|\rho| \le 1\))。数值误差会慢慢破坏对称性和正定性,实际代码里常对 \(\Sigma\) 做 \((\Sigma+\Sigma^\top)/2\) 对称化,或加一点很小的对角项。
乘积公式的前提和 4.2 节一样:两份信息来自独立的来源。如果两个估计共用了同一批数据(比如两个滤波器都用了同一个里程计),直接相乘会重复计票,得到过度自信的结果。这种情形要用"协方差交叉 (covariance intersection)"之类保守的融合。
朝向角 \(\theta\) 住在一个圆上,179° 和 −179° 其实只差 2°,普通高斯会把它们看成差 358°。小范围内把角度当高斯是个好近似;大不确定性或三维旋转要用李群上的扰动(第 5 章)。
8小练习
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 — 高斯分布与它们的乘积,配可运行代码