pykalman使用教程

» 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)。

实现代码:

pykalman_update_filter.py

在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]]])

官方文档