一句话定义:粒子滤波(Particle Filter)是一种用大量带权重的随机样本(叫"粒子")来表示概率分布的算法,专门用来在非线性、非高斯(non-Gaussian)的动态系统里做状态估计。
打个比方:黑楼里找人的一千个分身
假设有人在漆黑的商场里走丢了。你不知道他在哪,只有一个模糊的猜测:"大概在三楼,可能靠近电梯"。
于是你派出一千个虚拟分身,每个分身代表一种"他可能在这"的假设。接下来循环三步:
1. 预测:每个分身按常识往前走一步——他大概会往出口方向走,但可能被柜台挡住,所以你给每个分身加一点随机扰动。
2. 更新:这时监控捕捉到一个模糊影子。离影子近的分身更可能猜对,权重(weight)调高;离得远的权重调低。
3. 重采样(resampling):把权重低的淘汰掉,让权重高的分身"繁殖"出新的分身,再各加一点扰动。
重复几轮后,这一千个分身会聚集成几团——可能集中在自动扶梯口,也可能分散在三个出口。这些抱团的分布,就是你对"他在哪"的估计。粒子滤波做的就是这件事:用样本的密度和权重,去逼近一个说不清形状的概率分布。
它和卡尔曼滤波差在哪
卡尔曼滤波(Kalman Filter)也做状态估计,但它默认系统是线性的、噪声是高斯的——这种分布像一个规规矩矩的钟形山包,用"均值 + 方差"就描述清楚了。现实往往没这么乖:目标在遮挡下可能有两个位置,噪声可能带尖峰。这时候钟形假设直接崩掉,而粒子滤波不假设分布长什么样。
| 维度 | 卡尔曼滤波类 | 粒子滤波 |
|---|---|---|
| 分布假设 | 线性、高斯 | 任意形状,允许双峰 |
| 状态表示 | 均值 + 协方差 | 一堆带权重的样本 |
| 计算开销 | 低、稳定 | 高,随粒子数增长 |
| 典型场景 | 平滑轨迹跟踪 | 机器人定位、遮挡跟踪 |
对做事的实际意义
粒子滤波最出名的落地是机器人领域的蒙特卡洛定位(Monte Carlo Localization):机器人在激光雷达地图里撒粒子,走得越久位置越确定。此外还有视觉多目标跟踪、SLAM、金融时序、以及统计里的序列蒙特卡洛(Sequential Monte Carlo,SMC)。
落地时最常被问的两件事是粒子数和重采样策略:粒子太少精度不够,太多算不动;不重采样会"粒子退化"——所有重量压在一两个样本上;重采样太狠又会"样本贫化",多样性没了。另外,粒子之间彼此独立,天然适合并行到 GPU 上。具体框架和库的实现细节,以官方页面为准。
一句话记住它:当解析解算不动时,就让一群带权重的猜测去投票。
