pykalman使用教程
Aug 25, 2021
»
kalman
kalman smoother & kalman filter
相关参数 | 对应参数 |
---|---|
initial conditions | initial_state_mean and initial_state_covariance |
transition parameters | transition_matrices, transition_offsets(主要用于传递时变信息), transition_covariance |
observation parameters | observation_matrices, observation_offsets, observation_covariance |
初始值:一维数组赋予0,二维数组赋予单位矩阵
一维时参数参与初始化的过程(理解参数的含义)
from scipy.stats import norm
import numpy as np
states = np.zeros((n_timesteps, n_dim_state))
measurements = np.zeros((n_timesteps, n_dim_obs))
for t in range(n_timesteps-1):
if t == 0:
states[t] = norm.rvs(initial_state_mean, np.sqrt(initial_state_covariance))
measurements[t] = (
np.dot(observation_matrices[t], states[t])
+ observation_offsets[t]
+ norm.rvs(0, np.sqrt(observation_covariance))
)
states[t+1] = (
np.dot(transition_matrices[t], states[t])
+ transition_offsets[t]
+ norm.rvs(0, np.sqrt(transition_covariance))
)
measurements[t+1] = (
np.dot(observation_matrices[t+1], states[t+1])
+ observation_offsets[t+1]
+ norm.rvs(np.sqrt(observation_covariance))
)
离线更新,采用smooth或filter方法
1、定义kalman滤波器参数
kf = KalmanFilter(
transition_matrices=[[1, delta_t], [0, 1]], #系统矩阵
transition_offsets=[0, 0],#类似于输入矩阵与输入的乘积,注意格式,
#如有三个状态量就写成[0, 0, 0]
transition_covariance=[[0, 0], [0, 10]],#模型协方差
observation_matrices=[1, 0],#观测矩阵,仅有一个观测量
observation_offsets=[0],#类似,因为只有一个观测量
observation_covariance=[10],#观测协方差
initial_state_mean = [0, 0],#以下两项用于定义初始的状态
initial_state_covariance = [[1, 0], [0, 1]]
em_vars: List[str] = ['transition_matrices', 'observation_matrices',
'transition_offsets', 'observation_offsets',
'transition_covariance', 'observation_covariance',
'initial_state_mean','initial_state_covariance'],
#em_vars用于定义应用em算法时,对那些参数进行训练
#如:em_vars=['transition_covariance','observation_covariance']
#代表仅对这两个参数进行训练
)
2、em训练kalman滤波器参数(可选)
kf.em(
X=z#这里填测量值序列
em_vars#效果同在滤波器内的定义
)
3、进行滤波并得到后验估计
(filtered_state_means, filtered_state_covariances) = kf.filter(z)
(smoothed_state_means, smoothed_state_covariances) = kf.smooth(z)
#等式左侧的两个参数分别代表后验状态、后验协方差;每行代表一个时刻的多个状态;
#行数代表有多少个时刻
#等式右侧的参数z,代表测量值的序列
#默认下推荐用smooth,其比filter更平滑,而且与其拥有相似的均值与方差
实现代码: pykalman_smooth_filter.py
在线更新,采用filter_update方法
普通在线更新
步骤一与smooth及filter的第一步相同,都是先定义kalman的参数。 第二个步骤即可进行在线更新,方法如下:
(x_kalman, cov_kalman) = kf.filter_update(x_kalman, cov_kalman, observation=z[i])
# x_kalman, cov_kalman分别代表上一状态以及上一状态的协方差,
# 格式分别为(n_dim_state)、(n_dim_state,n_dim_state)。
# z[i]代表最新时刻的观测值,格式为(n_dim_obs)
# 输出x_kalman, cov_kalman的格式分别为(n_dim_state)、(n_dim_state,n_dim_state)。
实现代码:
在smooth或filter的基础上更新
步骤一与smooth及filter的第一步、第二步(可选)、第三步相同。 步骤二如下:
(x_kalman, cov_kalman) = kf.filter(z)
(x_kalman1, cov_kalman1) = kf.filter_update(x_kalman[-1], cov_kalman[-1], 100)
# 利用最新的观测值100进行更新,并输入最后一个时刻的均值x_kalman[-1],以及
# 协方差cov_kalman[-1]。输出x_kalman1, cov_kalman1的形状分别为(2,),(2,2)
#以下分别对t_space_a、x_kalman、z进行了拼接,方便绘图
t_space_a = np.concatenate([t_space, [t_space[-1]+delta_t]])
x_kalman1 = x_kalman1.reshape(1, 2)
x_kalman = np.concatenate([x_kalman, x_kalman1], axis=0)
z = np.reshape(z, (iter_n, 1))
z_a = np.concatenate([z.reshape(iter_n, 1), [[100]]])