“学习的同时记录,记录的同时分享,分享的同时交流,交流的同时学习。”node
先上一个卡尔曼的照片,以表敬意:python
卡尔曼滤波器
-
英文kalman filter -
这里介绍简单的,只有一个状态的滤波器 -
卡尔曼滤波器常常用在控制系统中、机器人系统中,可是这里主要讲解如何用在AI的大数据分析预测中 -
为何考虑到用这个处理时间序列?由于有一个队员提出,在处理电信号、语音、位置信息的时候,使用kalman滤波器能够更有效的过滤更多的噪音。 -
在尝试特征工程的时候,我是把这个方法当成一个玄学,看看是否能够提升效果,由于我目前还理解不了这其中的统计学的奥秘。
为何要用kalman filter
假设咱们有100个时间点的数据,这个数据就是分别在100个点观测出来的结果。web
对于每个时间点的数据,获取的方法有两个:面试
-
第一个就是观测,可是测量的结果不必定准确,可能受限于测量仪器的精度? -
第二个就是用这个时间点以前的全部数据,预测这个时间点的数据,固然,这个预测值也是不许的。 -
能否利用这两种方法,相互促进,预测的值更准,或者说让观测到的值更接近本质?Kalman Filter卡尔曼滤波器就这样作的。
这里确定会有人不理解,观测到的值都不必定准,你怎么还能依赖于预测的值呢?(其实这个是阿里的面试官反驳个人话,当时我确实蒙了,由于这个方法只是拿来用在特征构建中,其实滤波器是用在控制系统专业中的,下面是朋友给我讲的一个例子。)算法
【破解概念上的认知枷锁:卡尔曼滤波究竟作了什么事情】微信
卡尔曼滤波作的事就是:举个例子,已知上个时刻飞机的位置,知道如今这个时刻收到的雷达测量的飞机的位置。用前面两个数据来估计此时飞机的位置。精简的说就是知道上个时刻状态,又知道测量数据,融合这两个数据来求当前状态。机器学习
你必定会问如今知道当前时刻的测量数据那么我认为当前状态就是测量数据不就行了么?换句话说:“你必定会以为雷达测量到的飞机位置不就是当前飞机的位置嘛?为什么要用卡尔曼滤波来估计飞机当前的位置?”。编辑器
答:如今这个时刻收到的雷达信号测量的飞机的位置还真不必定是飞机当前的真实位置。首先雷达信号测量有偏差。其次你想一想我如今收到雷达信号,那是以前发射过去而后返回的信号。这个过程是否是要时间?这段时间飞机说不定以超2倍音速飞行,说不定直接坠机,这些都有可能。也就是说即便收到测量数据可是仍是不确飞机位置在哪。因而我得须要根据前一个时刻的位置估计出当前时刻的飞机位置 结合 测量数据 综合考虑来 估计当前飞机位置。这就是卡尔曼滤波的做用。svg
那么你必定会问:根据前一个时刻估计的飞机位置怎么就能够估计如今这个时刻的飞机位置了?函数
答:卡尔曼认为全部的状态变化(位置变化)都是线性的。什么叫作线性?上个时刻位置是0.3,速度是0.2。那么我估计下个时刻的位置就是0.5。这就叫作线性。
接下来你必定会问:那并非全部的状态变化都是线性的怎么办?你像风速变化它就不是线性的。
答:恭喜你发明了新的算法。事实上别人已经为这个算法命名了叫作扩展卡尔曼滤波。如今咱们要学习的是卡尔曼滤波。你只须要记住卡尔曼滤波就是认为全部变化都是线性的。
那么如今我知道了怎么用上个时刻飞机的位置估计当前时刻的飞机位置,也知道了还得借助当前时刻收到的测量数据来综合考虑来估计当前飞机的位置。那么怎么综合考虑呢?这就涉及到一个比例。到底这两个数据占比多少?这就是卡尔曼滤波的核心精髓。卡尔曼滤波算法要动态的调这个比例。(有种中庸之道的调调,既不仅信测量数据,也不仅信上个时刻的位置所估算的当前时刻位置。)
简单讲讲kalman filter的过程
每个观测数据,严谨的说都应该会有一个误差值。比方说,如今温度计测量是26度,误差值是0.5度,那么真实的问题应该是在(25.5,26.5)之间,或者写成 。
这样咱们预测的值,和观测的值,再加上这两个各自的误差,总共四个已知信息,来推测真实的、更本质的数据。
-
预测的值:能够经过事先设定的公式,上一个时刻的真实的值算出来; -
观测的值:直接读取测量仪器的值。 -
观测的值的误差:这个也是能够直接获得的; -
预测的值的误差:这个是从上一个时间点的预测的值的误差通过给定公式计算出来的。
下面的公式中,脚标k表示时间点,k-1是上一个时间点。大写字母A,B,C表示常数,事先设定的;大写字母H,是一个须要计算的。
-
预测的值: -
观测的值: -
观测的值的误差: -
预测的值的误差: -
kalman增益H: -
真实的值:
能够看出,这个kalman增益就是一个加权平均的权重,是观测值更重要仍是预测值更重要;二者的重要性就由二者的误差大小决定,误差小的更重要。
其中 表示上一个时间点的控制信号,比方说一个机器人,机器人的状态去以为机器人自身的行为,可是不少状况这个控制信号是不用考虑的。比方对股市的时间序列作kalman滤波,那么并无什么控制信号去控制,只是任由其自由发展。
举一个例子,房间的温度的例子:
总共有三个时刻,上午、下午和晚上(实际的话,时间点间隔应该会很短,这里只是举例),上午温度是观测值是23度,误差是0.5,由于上午是第一个时间点,因此没有预测值;
下午,假设A=1,B=0,因此下午的预测值是23度,而后假设初始误差是1;下午的观测值是25度,观测值的误差是0.5,因此能够计算获得kalman增益 ,因此下午的真实值是:
晚上,晚上的预测值就是上一时刻的真实值,因此是24.6,误差是 ;晚上的观测值是20度,而后误差是0.5,因此kalman增益增益,因此这个时刻的真实值是:
最后总结一下,其实咱们只须要什么呢?须要知道观测的偏差是0.5,而后三个时间点的观测数据:[23,25,20],而后用kalman滤波器以后,就变成[23,24.6,22.56]。相似于一个平滑的做用。
python怎么实现呢?
from pykalman import KalmanFilter
def Kalman1D(observations,damping=1):
# To return the smoothed time series data
observation_covariance = damping
initial_value_guess = observations[0]
transition_matrix = 1
transition_covariance = 0.1
initial_value_guess
kf = KalmanFilter(
initial_state_mean=initial_value_guess,
initial_state_covariance=observation_covariance,
observation_covariance=observation_covariance,
transition_covariance=transition_covariance,
transition_matrices=transition_matrix
)
pred_state, state_cov = kf.smooth(observations)
return pred_state
这里面使用的是pykalman库中的KalmanFilter,由于上面讲解的Kalman Filter是简化的,绕开了正统的解释的正态分布的知识,因此这里的卡尔曼滤波器的参数可能没法与上面给出的卡尔曼公式中一一对应,会产生必定的脱节,可是本质相同。(说白了就是我学的不够透彻2333)
这里讲一下参数:
-
initial_state_mean和initial_state_covariance: 在上面的公式中,一开始的初始值,就是第一个观测值,可是在这个方法中,初始值并非第一个观测值,而是由一个正态分布中随机采样出来的一个值,这个正态 分布就是以initial_state_mean为均值,以initial_state_covariance为方差的; -
observation_covariance这个能够至关于观测误差; -
transition_covariance这个就是预测误差; -
transition_matrices就是上面公式中的大写字母A,为1。
运行结果
从上面的那个函数中,能够看到transition_covariance是0.1,也就是预测误差时0.1,因此假设观测误差很小,那么能够想象,滤波器后的结果应该与观测值很是接近,这里选取观测误差为0.001:而后假设观测偏差很大,那么能够想一想,平滑的力度会很大,结果就是:
最后看一下在某次比赛中的利用kalman滤波器来平滑数据的先后对比图:
喜欢的话,长按下面的二维码关注下【机器学习炼丹术】,成为炫酷的炼丹师吧!
目前在更:天天一两个AI面试干货知识点。
公众号中回复【下载】有免费的精选的机器学习相关的学习资料哦,持续更新哦!
欢迎你们加我好友,交流学习知识,携手并进。
还有更多的知识点:
AI面试扩展之LightGBM = GOSS + histogram + EFB
本文分享自微信公众号 - 机器学习炼丹术(liandanshu)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。