• KaFormer个人笔记整理


    好处很多:实现简单, 是一个纯时域的filter,不需要进行频域变换,所以在工程上有很多应用。

    举个经典的例子:

            有辆汽车在行驶,我们用位置和速度表示它当前的状态,写成矩阵形式就是一个二维的列向量,这个列向量里面的两个元素就是它的状态,位置p_{t}与速度v_{t},另外驾驶员可以踩油门或者刹车,有一个向前或者向后的加速度u_{t},u表示对车的一个控制量,如果驾驶员没有踩油门或者刹车,u就等于0,车就会做匀速直线运动。

            如果我们已知上一时刻的状态x_{t-1},那么当前状态x_{t}表达会是什么呢,如图所示

             我们观察这两个公式发现输出变量都只是输入变量的线性组合,这就是我们为什么说卡尔曼滤波器是最佳的线性滤波器,因为它只能描述状态与状态之间的线性关系,既然是线性关系,我们就可以把它写成矩阵的形式,我们再进一步的把两个状态变换矩阵提取出来,然后公式可以简化成右下角所示公式 。

             这个公式就是卡尔曼滤波器第一个公式(状态预测公式),其中F就叫做状态转移矩阵,它表示我们如何从上一时刻的状态来推测当前时刻的状态其中B叫做控制矩阵,它表示控制量u如何作用于当前状态(看左上角公式能很好的理解)

     

    这里\hat{x}_{t}^{-}=F_{t}\hat{x}_{t-1}^{-}+B_{t}u_{t}\hat{x}表示对x估计量,而不是x的真实值,因为汽车的真实状态我们是无法知道的,我们只能通过观测来尽可能的估计x的值。\hat{x}_{t}^{-}还有个减号的上标,表示这个值是通过上一时刻的状态推测而来的,待会儿我们还要通过观测量来修正x的值,修正之后才可以算是最佳的估计值。也就是没有减号上标x,有了状态预测公式,我们就可以推测当前时刻的状态,但我们知道所有推测都是包含噪声的,噪声越大不确定性就越大,我们如何来表示推测带来多少不确定性呢,这时候我们就要用协方差矩阵来表示,那么什么是协方差矩阵呢?我们从一维简单情况来解释一下···

            假设我们有一个一维包含噪声的数据,每次测量的值都不同,但都是围绕在一个中心值的周围,那我们表示它们分布状况最简单的方法就是记下它的中心值方差,这实际上是假设这些数据是高斯的一个分布

            我们再来看看二维的情况,把二维数据分别在两个坐标轴上进行投影,在两个轴上都是高斯分布(图左),那我们在表示它的分布的时候,是不是分别记下来两个高斯分布的中心值和方差就可以了呢。如果两个噪声是独立的时候,是可以这么表示的,但是两个维度有相关性的情况下,比如在一个维度噪声增大的时候,另一个维度噪声也增大(图中),比如在一个维度噪声增大的时候,另一个维度噪声减小(图右),这时候在两个坐标轴的投影与图左是完全没有差别的,仍然是高斯分布,所以为了表示这两个维度之间的相关性,除了要记录两个维度的方差外,还要有一个协方差来表示两个维度之间的相关程度

            把二维(位置,速度)的协方差写成矩阵的形式就是这样的,对角线的两个值是两个维度各自的方差,反对角线上的两个值是相等的,是这堆二维数据的协方差。在这三种情况中,协方差=0(独立),>0(正相关),<0(负相关).

    重点 :在卡尔曼滤波器中所有关于不确定性的表述都要用到协方差矩阵

            在我们小汽车的例子中,每一个时刻状态的不确定性都是由协方差矩阵P来表示的,那么下一个问题就是,我们如何让这种不确定性在每个时刻之间传递呢?答案就是乘上状态转移矩阵F,这次是要在左右两边各乘一次

             写的具体一点就是这样的,从上一时刻推测当前时刻的协方差,就等于上一时刻协方差的两边乘以状态转移矩阵,至于为什么要乘以两边,这是协方差矩阵的一个性质,

             x的协方差是P,想计算FX的协方差,就可以把F从里面提到两边来,这时候我们还要考虑一件事情,就是我们的预测模型并不是100%准确的,它本身也是包含噪声的,

             所以我们要在后面加上一个协方差矩阵Q来表示预测模型本身带来的噪声

            这个公式代表卡尔曼滤波器第二个公式,它表示不确定性在各个时刻之间的传递关系。

             回到我们这个小汽车的模型,假设我们在公路的一端放置激光测距仪,在每个时刻都可以观测到汽车的位置,观测到的值记作Zt,那么从汽车本身的状态Xt到观测状态Zt之间有一个变换关系,我们记作H,当然这个关系也只能是线性关系,因为卡尔曼滤波器是线性滤波器,所以我们理所当然的要把H写成矩阵形式,XZ的维度不一定是相同的,在我们的例子里,X是一个二维的列向量,Z只是一个标量的值,H应该是一个一行两列的矩阵,里面的元素分别是1和0,这样HX相乘的时候就可以得到一个标量的值Z,而Z也就是汽车的位置,它和X第一个元素是相等的,那为什么后面加一个小写的v呢,因为我们观测值也不是100%可靠,所以我们后面要加上一个v来表示观测噪声,而这个噪声的协方差矩阵,我们用R来表示,由于在我们这个例子里,观测值是一个一维的值, 所以这个R的形式也不是一个矩阵而是一个单独的值,仅仅表示Z的方差,假设我们除了激光测距仪外,还有别的测量方法可以观察到汽车的某项特征,那么Z就会变成一个多维的列向量,它会包含每一种测量方式的测量值,而每一个测量值都只是真实状态的一种不完全的表现,我们可以从几种不完整的表述里面推断出真实的状态,而卡尔曼滤波器数据融合的功能,就正是在这个测量矩阵中体现出来的

             我们已经有了观测量Z和它的噪声协方差矩阵R,那我们如何把它们整合进我们对状态X的估计呢, 我们在前面已经得到了带减号的\hat{x}_{t}^{-},现在我们只需要在它的后面加上一项来修正它的值(下图公式1),就可以得到我们的最佳估计值了,那么加上的这一项是什么东西呢?先看括号里面的东西,这表示实际的观测值和我们预期的观测值之间的残差,这个残差乘上一个系数Kt,就可以用来修正\hat{x}_{t}的值了,这个Kt十分关键,叫做卡尔曼系数,实际上它也是一个矩阵,它的公式是这样的(下图公式二),这个公式的推导比较复杂,所以我们只是定性的分析一下,这个卡尔曼系数K作用主要有两个方面,一是权衡预测状态协方差P和观察量的协方差矩阵R的大小,来决定我们相信预测模型多一点还是相信观察模型多一点,如果相信预测模型多一点,这个残差的权重就会小一点,反之亦然。二是把残差的表现形式观察域转换到状态域,这什么意思呢?

             我们刚才讲到观察值Z是一个一维的向量,状态X是一个二维的列向量,他们所用的单位甚至描述的特征都有可能是不同的,那我们怎么可以用观察值(只有位置信息)的残差更新状态值(位置和速度)呢?实际上这个卡尔曼系数K呢就是在替我们做这样的一个转换,在这个小车的例子,我们只观察到汽车的位置,但K里面已经包含了协方差矩阵P的信息,所以它利用位置和速度这两个维度的相关性,从位置的残差里面来推算出了速度的残差从而让我们可以对状态X的两个维度同时进行修正,好了,现在只差最后一步了,最后一步就是更新最佳估计值的噪声分布,这个值是留给下一轮迭代时用的,在这步里,状态的不确定性是减小的,而在下一轮迭代中呢,由于传递噪声的引入,不确定性又会增大,卡尔曼滤波器就是在这种不确定性的变化中寻求一种平衡的。

             到现在为止,已经有了卡尔曼滤波器的五个公式,把他们完整的列出来看一下,在这五个公式中,前两个是通过上一时刻的状态来预测当前时刻的状态,通过这两个公式我们得到的是带减号上标的X和P,这表示这并不是最佳的估计值,减号的上标表示它们还欠缺点什么东西,这个欠缺的东西就是从观测值那儿里面带来的信息,因为我们还没考虑当前时刻的观测值,后面三个公式就是用当前观测值来更新X和P,经过更新后的值就是最佳观测值了。

     

    用Matlab实现的例子

    1. 1.需要把变量融入nn.Parameter
    2. 2.看看Karman-attention 2020 nuerips spotlight

    参考资料

    【不要再看那些过时的卡尔曼滤波老教程了】2022巨献,卡尔曼滤波-目标追踪从理论到实战最新版全套教程!建议收藏_哔哩哔哩_bilibili //内容大部分摘自该视频

  • 相关阅读:
    堆 与 堆排序
    操作系统真象还原_访问vaddr对应的pte
    高效率的10进制转2进制(C版)
    ESP32编译出现Cannot establish a connection to the component registry.报错
    python3.10.10安装
    计算机二级Office真题解析 excel减免税,订单,成绩
    【前端开发】CSS BEM命名规范
    【PyTorch深度学习项目实战100例】—— 利用pytorch长短期记忆网络LSTM实现股票预测分析 | 第5例
    home assistant弹出卡片
    HRD特征及其检测方法简介
  • 原文地址:https://blog.csdn.net/weixin_43332715/article/details/125316632