关于卡尔曼滤波和卡尔曼平滑关系的理解


这里不对卡尔曼滤波(Kalman Filter)作入门级介绍,有兴趣的请自行查阅相关资料。这篇短文的目的主要是探讨卡尔曼平滑(Kalman smoother)的作用,提醒注意卡尔曼平滑在离线数据处理中的重要作用。

 

在PRML第637页,提到在线性动态系统(LDS: lineardynamical systems)中,前向迭代为卡尔曼滤波,反向迭代为卡尔曼平滑。那么,这里的卡尔曼平滑指的是什么呢?网上搜索,基本也只有卡尔曼滤波的介绍,鲜有提及卡尔曼平滑的。事实上,对于离线数据,经过卡尔曼平滑的处理,可以获得比仅进行卡尔曼滤波更高的精度。

 

假设有隐变量序列z(1),z(2),… z(N)和观测变量序列x(1),x(2),… x(N),我们的目的是利用序列X推断计算序列Z。卡尔曼滤波也就是前向迭代计算的是alpha_caret(zn) = p(zn|x1,...xn)的均值mu和方差V,其中均值序列mu即为经过卡尔曼滤波得到的隐变量序列z。也就是说,在计算第n个隐变量z(n)的均值时,只使用了前n个x值的信息,而没有使用x(n+1),… x(N)。这适用于在线数据实时计算的场景,即在计算z(n)时,只接收到了x(1),… x(n),而尚未获得x(n+1),… x(N)。但是,在离线数据计算时,也就是已经全部获得x(1),…x(N)数据之后再计算z(n)时,完全可以使用所有x数据,即计算p(zn|x1,...xN)(注意下标的变化)。按照PRML书中变量定义,也就是计算gamma(zn)=p(zn|X)的均值mu_caret和V_caret,其中mu_caret即为经过卡尔曼滤波和平滑之后预测的隐变量序列z。从计算过程上来说,需要先正向迭代进行卡尔曼滤波,再反向迭代进行卡尔曼平滑。具体算法可参见PRML第13章。

 

实际计算可知,在离线数据计算中,因为使用了更多的观测数据,经过卡尔曼滤波和平滑之后,相比于只有卡尔曼滤波,结果精度可进一步提升。详尽如下代码及计算结果。


计算结果(注意与 http://blog.csdn.net/foreseerwang/article/details/77503723 对比):

****************************************************************
观测误差均值为:0.829;均方差为:1.065
滤波后误差均值为:0.165;均方差为:0.241
滤波+平滑后误差均值为:0.113;均方差为:0.143
****************************************************************




 代码如下:

clear all; close all; rng('default');

%% 2017.9.7
% kalman filter + kalman smoother
% web: http://blog.csdn.net/foreseerwang
% QQ: 50834

%% 初始化参数
n_iter = 300;       % 计算连续n_iter个时刻
n = 2;              % 隐变量设定两个维度:[温度,变化间隔]
m = 1;              % 观察变量仅设定一个维度:温度

% 生成试验数据。真实温度序列为xreal,观测到的温度序列为z
% 下面迭代计算时只会用到z,xreal只在最后对比结果时使用
xrate=0.01;                     % 温度变化率
xreal = 24+(0:n_iter-1)*xrate;  % 真实温度。温度变化间隔为1
z = xreal + randn(m,n_iter);    % 观测到的温度,误差方差为1

% 基于序列z,应用卡尔曼滤波和平滑后的预测
x_fwd = zeros(n, n_iter);       % 状态(隐变量),经过前向Kalman滤波后的结果
x_bwd = zeros(n, n_iter);       % 状态(隐变量),经过Kalman前向滤波和后向平滑后的结果
V_fwd = zeros(n, n, n_iter);    % x_fwd的方差,温度及变化间隔的方差
V_bwd = zeros(n, n, n_iter);    % x_bwd的方差,温度及变化间隔的方差
P = zeros(n, n, n_iter-1);      % 中间变量

% 卡尔曼滤波器相关参数
% A:状态转移矩阵,根据上一时刻x值预测当前x值
%   这里直接使用了真实的x变化率xrate,
%   事实上,随机设定xrate同样可以得到基本相同的结果
kf_para.A=[1,xrate;0,1];
kf_para.H = zeros(m,n);         % 观测转换矩阵,即:z=H*x
kf_para.H(1)=1;                 % 只关心温度,所有只观察x的第一个维度
kf_para.Q = [4e-4, 0; 0, 1e-4]; % 预测误差的方差
kf_para.R = 0.25;               % 观察误差的方差

%% 迭代
% 前向卡尔曼滤波(Kalman Filter)
x_fwd(:,1)=[z(1); 0.9];         % 初始化,第一个时刻的温度及变化间隔
V_fwd(:,:,1)=diag(rand(n,1));   % 随机初始化

for ii = 2:n_iter,
    xtmp = kf_para.A*x_fwd(:,ii-1);
    P(:,:,ii-1) = kf_para.A*V_fwd(:,:,ii-1)*...
        kf_para.A' + kf_para.Q;                         % PRML式13.88
    
    K = P(:,:,ii-1)*kf_para.H'/...
        (kf_para.H*P(:,:,ii-1)*kf_para.H'+kf_para.R);   % PRML式13.92
    
    x_fwd(:,ii) = xtmp+K*(z(ii)-kf_para.H*xtmp);        % PRML式13.89
    V_fwd(:,:,ii)=(eye(n)-K*kf_para.H)*P(:,:,ii-1);     % PRML式13.90
end

% 反向卡尔曼平滑(Kalman Smoother)
% 这两个式子在PRML中没有直接列出,可以自行推导
x_bwd(:, n_iter) = x_fwd(:, n_iter);
V_bwd(:, :, n_iter) = V_fwd(:, :, n_iter);

for ii = n_iter-1:-1:1,
    J=V_fwd(:,:,ii)*kf_para.A'/P(:,:,ii);               % PRML式13.102
    
    x_bwd(:,ii)=x_fwd(:,ii)+J*(x_bwd(:,ii+1)-...
        kf_para.A*x_fwd(:,ii));                         % PRML式13.100
    V_bwd(:,:,ii)=V_fwd(:,:,ii)+...
        J*(V_bwd(:,:,ii+1)-P(:,:,ii))*J';               % PRML式13.101
end;

%% 结果打印
figure; hold on; 
plot(xreal, 'k.'); plot(z,'bo'); plot(x_fwd(1,:),'g*'); 
plot(x_bwd(1,:), 'rd');
leg=legend('真实温度', '观测温度', '卡尔曼滤波',...
    '卡尔曼滤波+平滑', 'Location', 'NorthWest');
set(leg,'Fontsize',20);
title('卡尔曼滤波和平滑效果图', 'FontSize', 20);
xlabel('样本点序列', 'FontSize', 20);
ylabel('温度', 'FontSize', 20);

figure;
plot(x_fwd(2,:));
title('滤波后的温度变化间隔(真实值为1)', 'FontSize', 20);

fprintf('****************************************************************\n');
fprintf('观测误差均值为:%5.3f;均方差为:%5.3f\n', ...
    mean(abs(z-xreal)), std(z-xreal));
fprintf('滤波后误差均值为:%5.3f;均方差为:%5.3f\n', ...
    mean(abs(x_fwd(1,:)-xreal)), std(x_fwd(1,:)-xreal));
fprintf('滤波+平滑后误差均值为:%5.3f;均方差为:%5.3f\n', ...
    mean(abs(x_bwd(1,:)-xreal)), std(x_bwd(1,:)-xreal));
fprintf('****************************************************************\n');


展开阅读全文

没有更多推荐了,返回首页