本文主要对下面几篇博文进行整理
传送门
前言
牛逼的算法往往都是来源于一个很简单的思想所演化而来,如果你不了解这个思想和演化过程那就谈不上了解那个牛逼的算法
方程
详细说明
卡曼滤波可转换为
举个例子
- 老师根据我的摸鱼状态预测我下次考试成绩为60分,而我上次考试考了70分,那么如何预测我下次的考试成绩呢?关键看上次笔者的考试成绩参考价值更大还是老师说的话参考价值更大了,如果我们各信一半,也就是五五开那么,预测下次考试成绩就可以用下面的式子来计算
类比到所以公式8,可以解释为
卡尔曼滤波的主要作用,主要还是找一个“确定一个参考价值”来预测下一次的值,但是卡尔曼滤波是有使用条件的。怎么判断事情适不适合用卡尔曼滤波来做呢?如果你需要对这件事做卡尔曼滤波,那么它应该满足下面两个方程。
举个例子来理解这两个方程
- 比如对房间温度进行测量,假设我们有一个很精确的温度计,可以精确到0.1,还要一个不靠谱的温度计,这玩意精度误差在 ±1度之间
- 首先房间内的温度,至少短期内是不会改变的,可以当做一个恒定的值来看待,而不靠谱的温度计,尽管观测起来上下飘动有点不靠谱,但是其误差其实是由规律可循的,比如这样,假如现在实验室的温度真的是34.5度,那么这个不靠谱的温度计的数应该大多在34.5度周围内,比如出现34.4度这个报数的概率会比出现33.8度的概率会大得多,也就是说,它的误差(噪声)是大致满足高斯分布的(很多的信号噪声都适用高斯分布)
所以对公式1进行解释为
- xk表示当前的状态,因为我们现在聊的是温度,所以它就表示当前时刻的温度
- xk-1就是前一时刻的状态(温度)
- uk-1是系统控制量,放心,大多数实际情况下,没有控制增益,所以你可以把它当做0
- wk-1是满足高斯条件的过程激励噪声,很拗口是不是?举个不是很恰当的栗子,你可以理解为现在实验室的那台八匹时好时坏的空调终于惹毛了导师突然就被导师踹了一脚,然后就开启了羊癫疯模式时而制冷时而制热,搞的现在实验室温度上下飘动.室内的温度我们可以把它当做一个定值,或者把这个噪声当做非常小忽略不计的一个干扰.
- 那么 A和 B 是什么,它们是系统参数,严格来说它们是矩阵,不过实际使用中它们常常就是一个值,为了方便理解卡尔曼滤波,现在它们就是一个值!在这里因为温度在短期内是恒定的,因此A是1,因为不存在控制量B是0,噪声也当做0处理
所以最后房间温度可以使用下图来表示
接下来我们理解公式2
- zk也就是现在我们用这个不太靠谱的传感器测出来的温度数值,
- H是一个矩阵,用来表示状态量对测量量的增益,举个栗子讲人话就是比如你测量距离你可以用米来表示也可以用千米来表示,不同的单位转换乘个数就行了
- vk说狗话它是一个满足期望为0协方差为 R 的高斯白噪声,说人话也就是这个传感器的靠谱程度
那么我们如何用不靠谱的温度传感器测量出靠谱的室内温度呢?
- 我们先用这个温度传感器,测出100次不靠谱的温度
- 接着我们看更新方程 的公式
公式3
- 和前面的解释差不多
- xk表示当前的状态,因为我们现在聊的是温度,所以它就表示当前时刻的温度
- xk-1就是前一时刻的状态(温度)
- uk-1是系统控制量,放心,大多数实际情况下,没有控制增益,所以你可以把它当做0
- 在这里因为温度在短期内是恒定的,因此A是1
公式4
- Pk狗话叫做预估误差协方差,人话就是之前说的这个值到底可信度是多少,在这里Pk是前次一的温度和后一次温度的可信度。你只需要初始值设为1剩下的你就不用管了,不然我们要卡尔曼滤波来干什么,卡尔曼滤波的过程也就是 Pk不断调整的过程
- Q实际上是一个经验值,说白点就是你自己看着办,Q越小表示越信任预测值,为0的话表示完全相信预测值,越大表示越相信测量值,在现在这个情况下,因为我100%相信房间里的温度短时间是不会变的,因此在这里我完全相信下一次房间的温度还是不会变的,因此这里 Q直接取0就行了
根据这两个公式我们最终成功建立了房间里温度的数学模型
然后我们再来看看状态更新方程
参数解释
- H用狗话说H是状态量到观测量的转换矩阵,实际上我们完全没必要搞得那么复杂,在大多数的情况下你就可以把这玩意设置为1
- Xk是我们的状态估计值,也就是卡尔曼滤波后我们"猜"出来的温度值,它的初值你可以直接设为0
- pk是预估误差协方差,理不理解无所谓了,反正它的初值你可以直接设为1或者随你喜欢的一个值(反正不能设为0,在卡尔曼滤波状态更新中这个值会自动调整
- zk是观测值,也就是在这里我们用这个不太靠谱的温度传感器测出来的温度值
- R值它是测量噪声协方差,说人话就是你觉得你手头上这个不太靠谱的传感器的靠谱程度,换句话说,这个值你可以自己看着办,因为现在知道这个温度传感器的误差是 R近似满足高斯分布,所以我估摸着大概取个0.2就行
对温度进行预测
可以看到,从54次后,卡尔曼滤波器的预测逐步稳定在了34.2度之间,用狗话说,就是收敛了,通过卡尔曼滤波器,我们最终得出房间里的实际温度应该就是34.2度左右了
本质探讨
有点像把全部测量值加起来然后取个平均
- 卡尔曼滤波是一个根据未来输入不断变换并自我调整的过程,这点你取平均恐怕是办不到。你可能已经发现,卡尔曼滤波本质上就是“更相信那些出现的比较多的,更不相信出现的比较少的”一个并不复杂的原理过程但需要统计学里的一些知识去解释,比如说32.5度这个测量值出现了5次,31.3度只出现一次,那么当然是更相信32.5往他那边靠啊,但数学表述需要一个严谨的、可量化的、范围化的过程,因此你最终看起来显得不那么好理解,究其本质实际上并没有公式上写的那么复杂。