在卡尔曼滤波器实现中,“预测估计协方差”,p(k k-1),(see the wiki here)是否可能是奇异矩阵?如果不是,我的代码有问题吗?
这是状态空间模型
% y{t}=Z{t} b{t} + eps{t}, eps{t} ~ N(0,H{t})
% b{t} = Pi{t} b{t-1} + tao{t} tao{t} ~ N(0,Q{t})
% b{1} ~ N(b0,P0)
% t=1,...,T
这是作为卡尔曼滤波算法主要部分的向后递归:
for t=1:T
v{t} = y{t} - Z{t} * b_tt_1{t};
M{t} = P_tt_1{t} * Z{t}';
F{t} = Z{t} * M{t} + H{t};
F_{t}= inv(F{t});
MF_{t}= M{t} * F_{t};
b_tt{t}=b_tt_1{t} + MF_{t} * v{t};
P_tt{t}=P_tt_1{t} - MF_{t} * M{t}';
b_tt_1{t+1} = Pi{t} * b_tt{t};
P_tt_1{t+1} = Pi{t} * P_tt{t} * Pi{t}' + Q{t};
end
这是在我使用实际数据时发生的。为了找出问题所在,我编写了一些代码来生成随机状态空间模型(如果需要,我可以提供代码)。
当t较大时,经过某个t0后,p{t 1{t0}是奇异的,并且状态(b{t0})发散。
编辑:
我使用了协方差更新方程的“joseph形式”(见wikipedia)。这是有帮助的,但是当状态空间模型很大时(从方程或状态的数量上来说),结果仍然是不同的。我认为这意味着这个问题与数值稳定性有关。有办法解决这个问题吗?
最佳答案
矩阵唯一可以变为单数的地方是:
F_{t}= inv(F{t});
您可以使用pseudo-inverse`pinv'代替。
或者,如果你重写这些行:
F_{t}= inv(F{t});
MF_{t}= M{t} * F{t};
到
MF_{t}= M{t} / F{t};
Matlab将解线性方程:
MF_{t} * F{t} = M{t}
-即使f{t}是奇异的,或者它仍然是通过伪逆的奇异解,也可能有解。