文章来自:微信公众号【机器学习炼丹术】
先上一个卡尔曼的照片,以表敬意:
卡尔曼滤波器
- 英文 kalman filter
- 这里介绍简略的,只有一个状态的滤波器
- 卡尔曼滤波器常常用在控制系统中、机器人零碎中,然而这里次要解说如何用在 AI 的大数据分析预测中
为什么要用 kalman filter
假如咱们有 100 个工夫点的数据,这个数据就是别离在 100 个点观测进去的后果。
对于每一个工夫点的数据,获取的办法有两个:
- 第一个就是观测,然而测量的后果不肯定精确,可能受限于测量仪器的精度?
- 第二个就是用这个工夫点之前的所有数据,预测这个工夫点的数据,当然,这个预测值也是不准的。
- 可否利用这两种办法,相互促进,预测的值更准,或者说让观测到的值更靠近实质?Kalman Filter 卡尔曼滤波器就这样做的。
这里必定会有人不了解,观测到的值都不肯定准,你怎么还能依赖于预测的值呢?(其实这个是阿里的面试官反驳我的话,过后我的确蒙了,因为这个办法只是拿来用在特色构建中,其实滤波器是用在控制系统业余中的)
【破解概念上的认知桎梏:卡尔曼滤波到底做了什么事件】
卡尔曼滤波做的事就是:举个例子,已知上个时刻飞机的地位,晓得当初这个时刻收到的雷达测量的飞机的地位。用后面两个数据来预计此时飞机的地位。精简的说就是晓得上个时刻状态,又晓得测量数据,交融这两个数据来求以后状态。
你肯定会问 当初晓得以后时刻的测量数据那么我认为以后状态就是测量数据不就好了么?换句话说:“你肯定会感觉雷达测量到的飞机地位不就是以后飞机的地位嘛?为何要用卡尔曼滤波来预计飞机以后的地位?”。
答 :当初这个时刻收到的雷达信号测量的飞机的地位还真不肯定是飞机以后的实在地位。首先雷达信号测量有误差。其次你想想我当初收到雷达信号,那是之前发射过来而后返回的信号。这个过程是不是要工夫?这段时间飞机说不定以超 2 倍音速航行,说不定间接坠机,这些都有可能。 也就是说即便收到测量数据然而还是不确飞机地位在哪。于是我得须要依据前一个时刻的地位预计出以后时刻的飞机地位 联合 测量数据 综合思考来 预计以后飞机地位。这就是卡尔曼滤波的作用。
那么你肯定会问:依据前一个时刻预计的飞机地位怎么就能够预计当初这个时刻的飞机地位了?
答:卡尔曼认为所有的状态变动(地位变动)都是线性的。什么叫做线性?上个时刻地位是 0.3,速度是 0.2。那么我预计下个时刻的地位就是 0.5。这就叫做线性。
接下来你肯定会问:那并不是所有的状态变动都是线性的怎么办?你像风速变动它就不是线性的。
答:祝贺你创造了新的算法。事实上他人曾经为这个算法命名了叫做扩大卡尔曼滤波。当初咱们要学习的是卡尔曼滤波。你只须要记住卡尔曼滤波就是认为所有变动都是线性的。
那么当初我晓得了怎么用上个时刻飞机的地位预计以后时刻的飞机地位,也晓得了还得借助以后时刻收到的测量数据来综合思考来预计以后飞机的地位。那么怎么综合思考呢?这就波及到一个比例。到底这两个数据占比多少?这就是卡尔曼滤波的外围精华。卡尔曼滤波算法要动静的调这个比例。(有种中庸之道的调调,既不只信测量数据,也不只信上个时刻的地位所估算的以后时刻地位。)
简略讲讲 kalman filter 的过程
每一个观测数据,谨严的说都应该会有一个偏差值。比方说,当初温度计测量是 26 度,偏差值是 0.5 度,那么实在的问题应该是在(25.5,26.5)之间,或者写成 $26pm0.5$。
这样咱们 预测的值 ,和 观测的值 ,再加上这 两个各自的偏差,总共四个已知信息,来揣测实在的、更实质的数据。
- 预测的值:能够通过当时设定的公式,上一个时刻的实在的值算进去;
- 观测的值:间接读取测量仪器的值。
- 观测的值的偏差:这个也是能够间接失去的;
- 预测的值的偏差:这个是从上一个工夫点的预测的值的偏差通过给定公式计算出来的。
上面的公式中,脚标 k 示意工夫点,k- 1 是上一个工夫点。大写字母 A,B,C 示意常数,当时设定的;大写字母 H,是一个须要计算的。
- 预测的值:$x^{预测}_k=A*x_{k-1}^{实在}+B*u_{k-1}$
- 观测的值:$x^{观测}_k$
- 观测的值的偏差:$p^{观测}_k$
- 预测的值的偏差:$p^{预测}_k = \sqrt{(1-H)*(p^{预测}_{k-1})^2}$
- kalman 增益 H:$H_k=\frac{(p^{预测}_k)^2}{(p^{预测}_k)^2+(p^{观测}_k)^2}$
- 实在的值:$x^{实在}_k=H_k*x^{观测}_k+(1-H_k)*x^{预测}_k$
能够看出,这个 kalman 增益就是一个加权均匀的权重,是观测值更重要还是预测值更重要;两者的重要性就由两者的偏差大小决定,偏差小的更重要。
其中 $u_{k-1}$ 示意上一个工夫点的管制信号,比方说一个机器人,机器人的状态去感觉机器人本身的行为,然而很多状况这个管制信号是不必思考的。比如对股市的工夫序列做 kalman 滤波,那么并没有什么管制信号去管制,只是任由其自在倒退。
举一个例子,房间的温度的例子:
总共有三个时刻,上午、下午和早晨(理论的话,工夫点距离应该会很短,这里只是举例),上午温度是观测值是 23 度,偏差是 0.5,因为上午是第一个工夫点,所以没有预测值;
下午,假如 A =1,B=0, 所以下午的预测值是 23 度,而后假如初始偏差时 1;下午的观测值是 25 度,观测值的偏差时 0.5,所以能够计算失去 kalman 增益 $H=\frac{1^2}{1^2+0.5^2}=0.8$,所以下午的实在值是:$0.8*25+(1-0.8)*23=24.6$
早晨,早晨的预测值就是上一时刻的实在值,所以是 24.6,偏差是 $sqrt{(1-0.8)*1}=0.4472$;早晨的观测值是 20 度,而后偏差时 0.5,所以 kalman 增益增益 $H=\frac{0.4472^2}{0.4472^2+0.5^2}=0.4444$,所以这个时刻的实在值是:$0.4444*20+(1-0.4444)*24.6=22.56$
最初总结一下,其实咱们只须要什么呢?须要晓得观测的误差是 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 是简化的,绕靠了正统的解释的正态分布的常识,所以这里的卡尔曼滤波器的参数可能无奈与下面给出的卡尔曼公式中一一对应,会产生肯定的脱节。
这里讲一下参数:
- 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 滤波器来平滑数据的前后比照图: