机器学习笔记:卡尔曼滤波
1 滤波
- 滤波的作用就是给不同的信号分量不同的权重
- 比如低通滤波,就是直接给低频信号权重1;高频信号权重0
- 降噪可以看成一种滤波:降噪就是给信号一个高的权重而给噪声一个低的权重
1.1 滤波、插值与预测
插值(interpolation) 平滑 (smoothing) |
用 过去 的数据来拟合 过去 的数据 |
滤波 (filtering) | 用 当前 和 过去 的数据来求取 当前 的数据 |
预测 (prediction) | 用 当前 和 过去 的数据来求取 未来 的数据 |
2 卡尔曼滤波
- 卡尔曼滤波器 由一系列递归数学公式描述。它们提供了一种高效可计算的方法来估计过程的状态,并使估计均方误差最小。
- 卡尔曼滤波器应用广泛且功能强大:它可以估计信号的过去和当前状态,甚至能估计将来的状态,即使并不知道模型的确切性
- Kalman Filter 只能减小均值为0的测量噪声带来的影响。只要噪声期望为0,那么不管方差多大,只要迭代次数足够多,那效果都很好。反之,噪声期望不为0,那么估计值就还是与实际值有偏差。
2.1 图示卡尔曼滤波的作用
- 我们考虑一辆小车在一条直线上行驶。
- 如果我们知道小车的运动方向、所受的力、质量等等参数,以及小车的初始状态,理论上我们可以求出它任意时刻的状态
- 但是小车内部(小车结构、车轮质地等)以及小车外部(环境因素)等可能存在不确定因素(噪声),这会导致小车不一定正正好好在预测的位置,会存在一定的噪声
- ——>我们假设每种不确定因素(噪声)都满足正态分布,那么我们可以据此对小车的位置进行估计:
根据小车的运动方程、小车的属性,我们可以估计处小车在下一时刻的位置
小车运动过程中,会不断地收到噪声的影响,因而t=1时刻方差(不确定性)比t=0时刻还要大。
为了避免纯理论估计估计带来的偏差,在 t=1 时刻对小车的位置坐标进行一次测量,当然对小车距离的测量也会受到种种不确定因素的影响,所以小车t=1 时的测量位置服从蓝色的正态分布:
于是我们得到了两个不同的分布,都是来描述小车的位置的。那么应该怎么结合这两个分布呢?
卡尔曼滤波的作用是找一个权重,将二者加权平均,合并为绿色的正态分布。那个就是卡尔曼滤波的结果
2.2 离散卡尔曼滤波
2.2.1 过程状态
注:这一小节的上下标和之后卡尔曼滤波的部分会有一定的差异
离散卡尔曼滤波器用于估计离散时间过程的状态变量 (小车的方向,速度等)
这个离散时间过程由以下离散随机差分方程描述:
估计的当前状态 | |
上一时刻的状态 | |
输入值 | |
噪声(满足正态分布) |
定义观测变量 (小车的位置),我们有:
当前时刻的观测变量 | |
当前状态变量 | |
噪声(和W独立,且也满足正态分布) |
2.2.2 时间更新方程
- 时间更新方程根据上一时刻(k-1 时刻) 的后验估计值,推算当前状态变量和误差协方差估计的值
- 先验估计
- 用来得到小车例子中的红色部分
更新方程如下:
( − 代表先验,
^ 代表估计)
已知第 k 步以前状态情况下,第 k 步的先验状态估计 知道测量变量之后,第k-1步的后验状态估计
(第k-1步 卡尔曼滤波的结果)
F(后面的A)
- 将上一时刻k−1 的状态变量 线性映射到当前时刻 k 的状态转换矩阵
- 实际中 F应随时间变化,这里假设为常数。
B 控制输入矩阵,假设为常数 输入值 先验协方差 ——>通过时间更新方程,我们得到k时刻 状态变量的先验估计(均值) 和先验协方差估计
2.2.2.1 先验协方差估计的推导
记先验和后验估计的误差为
于是先验和后验估计的协方差矩阵为
我们接下来推导
2.2.3 测量(状态)更新方程
使用当前时刻的测量值来更正预测阶段估计值,得到当前时刻的后验估计值。
测量状态方程的顺序是:
- 计算卡尔曼增益 Kk (第三行)
- 作用是使后验估计误差协方差 Pk 最小
-
- 观测误差的协方差矩阵R越大(观测的准确性越不能得到保障),越小(变相地先验预测的权重越大)
- 如果观测误差的协方差矩阵R趋近于0——>趋近于1/H
- 先验协方差估计越小(观测的准确性有保障),越小(先验预测的权重越大)
如果 先验协方差估计趋近于0——>趋近于0
- 观测误差的协方差矩阵R越大(观测的准确性越不能得到保障),越小(变相地先验预测的权重越大)
- 测量输出以获得 Zk
- 产生k时刻状态的后验估计 (第一行)
- 先验估计、测量变量Zk和预测的差【测量过程的观测值和预估值之间的差异】,这两项的线性组合
- 估计状态的后验协方差Pk (第二行)
——>
2.3 卡尔曼滤波的迭代
上一时刻计算得到的后验估计被作为下一时刻计算的先验估计
3 python实现
3.0 参数设置
令:
真实值x | -0.377 |
A(观测状态——>状态变量) | 1 |
H(状态变量——>测量值) | 1 |
R(测量噪声协方差) | 0.01 |
Q(过程激励噪声协方差(系统过程的协方差)) | 1e-5 |
3.1 手动实现
3.1.1 导入库
import numpy
import pylab
#导入库n_iter = 50
sz = (n_iter,)
x = -0.37727 # 真实值
z = numpy.random.normal(x,0.1,size=sz)
# 50个观测值 ,观测时存在噪声
#n_iter个样本点
3.1.2 参数设置
xhat=numpy.zeros(sz)
# x 滤波估计值 (后验)P=numpy.zeros(sz)
# 滤波估计协方差矩阵 (后验)xhatminus=numpy.zeros(sz)
# x 估计值 (先验)Pminus=numpy.zeros(sz)
# 估计协方差矩阵 (先验)K=numpy.zeros(sz)
# 卡尔曼增益
Q = 1e-5
# 过程激励噪声协方差xhat[0] = 0.0
P[0] = 1.0
R=0.01
3.1.3 卡尔曼滤波
for k in range(1,n_iter): # 预测 xhatminus[k] = xhat[k-1] #^X_k_=A^X_{k-1}+BU(k-1) #A=1, 这里没有输入,所以U= 0 Pminus[k] = P[k-1]+Q #Pk_=AP_{k-1}A^T+Q# 更新 K[k] = Pminus[k]/( Pminus[k]+R ) #K(k)=Pk_H'/[HPk_H' + R]#H=1 xhat[k] = xhatminus[k]+K[k]*(z[k]-xhatminus[k]) #X_k = X_k_ + K(k)[Z(k) - HX_k_], H=1 P[k] = (1-K[k])*Pminus[k] #Pk = (1 - K(k)H)Pk_, H=1
3.1.4 绘制结果
pylab.figure()
pylab.plot(z,'k+',label='noisy measurements')
#观测值
pylab.plot(xhat,'b-',label='a posteri estimate')
#滤波估计值
pylab.axhline(x,color='g',label='truth value')
#真实值
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('Voltage')
3.2 使用filterpy包
3.2.1 导入库
from filterpy.kalman import KalmanFilter
import numpy as npn_iter = 50
sz = (n_iter,)
x = -0.37727 # 真实值
z = numpy.random.normal(x,0.1,size=sz)
# 50个观测值 ,观测时存在噪声
#n_iter个样本点
3.2.2 参数设置
kf = KalmanFilter(dim_x=1, dim_z=1)
kf.F = np.array([1])
kf.H = np.array([1])
kf.R = np.array([0.1**2])
kf.P = np.array([1.0])
kf.Q = 1e-5
xhat[0] = 0.0
P[0] = 1.0
3.2.3 训练
for k in range(1,n_iter): kf.predict()xhat[k] = kf.xkf.update(z[k], 0.1**2, np.array([1]))
3.2.4 画图
pylab.figure()
pylab.plot(z,'k+',label='noisy measurements')
#观测值
pylab.plot(xhat,'b-',label='a posteri estimate')
#滤波估计值
pylab.axhline(x,color='g',label='truth value')
#真实值
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('Voltage')
机器学习笔记:卡尔曼滤波相关推荐
- 机器学习笔记之卡尔曼滤波(一)动态模型基本介绍
机器学习笔记之卡尔曼滤波--动态模型基本介绍 引言 回顾:动态模型 动态模型的相关任务 卡尔曼滤波介绍 引言 本节从动态模型开始,介绍卡尔曼滤波(Kalman Filter). 回顾:动态模型 我们在 ...
- 机器学习笔记之前馈神经网络(一)基本介绍
机器学习笔记之前馈神经网络--基本介绍 引言 从机器学习到深度学习 频率学派思想 贝叶斯学派思想 深度学习的发展过程 引言 从本节开始,将介绍前馈神经网络. 从机器学习到深度学习 在机器学习笔记开始- ...
- 一份520页的机器学习笔记!附下载链接
点击上方"视学算法",选择"星标"公众号 第一时间获取价值内容 近日,来自SAP(全球第一大商业软件公司)的梁劲(Jim Liang)公开了自己所写的一份 52 ...
- 700 页的机器学习笔记火了!完整版开放下载
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 作者 梁劲(Jim Liang),来自SAP(全球第一大商业软件公司). 书籍特点 条理清晰 ...
- 机器学习笔记十四:随机森林
在上一篇机器学习笔记十三:Ensemble思想(上)中,简要的提了一下集成学习的原理和两种主要的集成学习形式. 而在这部分要讲的随机森林,就算是其中属于bagging思路的一种学习方法.为了篇幅,b ...
- 机器学习笔记七:损失函数与风险函数
一.损失函数 回顾之前讲过的线性回归模型,我们为了要学习参数使得得到的直线更好的拟合数据,我们使用了一个函数 这个函数就是比较模型得到的结果和"真实值"之间的"差距&qu ...
- 吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection)
吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection) 对于异常检测算法,使用特征是至关重要的,下面谈谈 ...
- Python机器学习笔记:sklearn库的学习
自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括分类,回归,降维和聚类四大机器学习算法.还包括了特征提取,数据 ...
- 神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火
神经网络与机器学习 笔记-LMS(最小均方算法)和学习率退火 LMS算法和Rosenblatt感知器算法非常想,唯独就是去掉了神经元的压制函数,Rosenblatt用的Sgn压制函数,LMS不需要压制 ...
- 神经网络与机器学习 笔记—基本知识点(下)
神经网络与机器学习 笔记-基本知识点(下) 0.1 网络结构: 神经网络中神经元的构造方式与用于训练网络的学习算法有着密切的联系,有三种基本的网络结构: 0.7 知识表示 ...
最新文章
- MySQL Workbench
- JVM 参数含义:-Xms和-Xmx
- my Note debug - select one Opportunity from dialog list
- php字符串与数字比较,PHP容易被忽略而出错陷阱 数字与字符串之间的比较
- java author 认证_详解Java后端优雅验证参数合法性
- 一条数据的HBase之旅,简明HBase入门教程3:适用场景
- 小游戏开发--Cocos引擎
- git merge 的撤销
- 免费复制百度文库的VIP文章(非常简单!)
- url 转码 java_URL 转码遇到的坑
- 【ESP 保姆级教程】疯狂传感器篇 —— 案例:UNO/Mega + MQ2烟雾传感器 + MQ3酒精传感器 + MQ7一氧化碳传感器 + OLED
- 110配线架打法图解_110配线架的打线方法图例
- JSON与事件和BOM
- C# LINQ源码分析之ToList()
- 网络推广100法,果然很强悍。
- Soul网关-Disrutpor使用
- PMP备考大全:经典题库(敏捷管理第16期)
- 程序员被裁员该怎么办
- 牛客挑战赛34 A 能天使的愿望 (dp 分组背包)
- 大一暑假结果-俄罗斯方块
热门文章
- 攻防兼备:中国蚁剑使用指南及特征流量
- python 自制搜狗翻译工具
- sghdg jskadhs khad jlad jlajd
- regsvr32 命令注册COM组件报错模块已加载,但是对DLL的调用失败,错误代码0x80004005
- 浙江大学计算机研究生2020年录取分数线,2020年浙江大学考研分数线公布
- TS流格式小白入门解读
- 拼写检查器的编写[转]
- input输入框的各种使用方法
- 美国大学计算机视觉专业排名,美国大学计算机系统专业排名情况实用内幕分析大全...
- 怎么把Word转换PPT?这几个方法超好用