Matlab:在使用卡尔曼滤波器时,如何确保协方差矩阵是正定的

时间:2016-11-26 03:35:41

标签: linear-algebra covariance svd eigenvalue kalman-filter

对于复值数据,我发现很难确保协方差矩阵是正定的。举个例子,

P =

  10.0000 +10.0000i        0                  0          
        0            10.0000 +10.0000i        0          
        0                  0            10.0000 +10.0000i

我可以使用下面解释的cholesky或特征值来检查P的正定性。

(A)

[R1,p1] = chol(P)

R1 =

     []


p1 =

     1

因为p1> 0,A不是肯定的

(B)使用特征值:如果特征值为正,则P应为正定。

[r p]=eig(P)

r =

     1     0     0
     0     1     0
     0     0     1


p =

  10.0000 +10.0000i        0                  0          
        0            10.0000 +10.0000i        0          
    0                  0            10.0000 +10.0000i

然而,做svd(P)会给出所有积极的特征! 我哪里出错了,我该怎么做才能防止P矩阵成为非正定。在运行时和现实世界场景中,很难确定P的正定性。是否存在黑客攻击或出路?非常感谢你

1 个答案:

答案 0 :(得分:2)

检查复杂矩阵的正定性:

首先,对this question at math.stackexchange的回答说:

  

复杂矩阵A的必要和充分条件     肯定是Hermitian部分    A_H = 1/2·(A+A^H)是肯定的,     其中A^H表示共轭转置。

为什么P矩阵变为非正定:

然后,关于为什么P失去其正定性"的问题,通常的罪魁祸首是浮点表示/算术。

标准卡尔曼滤波算法在某些敏感操作中可以显示数值稳定性问题,例如在计算卡尔曼增益时采用矩阵S的逆,或者在更新时将优化应用于使用简化表达式进行误差协方差步骤P+ = (I - K·H)·P-

还有其他错误来源,如错误的实现或使用错误的数据(例如,定义过程/度量协方差矩阵,而这些矩阵本身并不是正定的)。

如何避免此问题:

我将关注第一个错误来源:数值稳定性。 通常使用许多替代方法来使卡尔曼滤波器更稳定并避免协方差矩阵问题:

  • 在每次迭代中纠正P中的小错误(formally not correct,但效果很好)。我过去成功地使用了简单的P = 1/2 (P + P')和真实的矩阵,但是有更多精心设计的方案。
  • 使用square-root Kalman filter或任何其他可提高稳定性的配方。由于它们保持并更新了P的平方根,因此不再存在不对称问题。它们也减少了一般的正定问题。
  • 转到64位FP算法。比使用单精度更稳定。
  • 通过缩放某些变量来改善数字条件。数字之间的较大幅度差异使得不准确性恶化,因此如果P在对角线值中以10 ^ + 3的顺序混合,其他值在10 ^ -6的数量级,则将后一变量的单位改为微 - 无论如何缩小差距。

使用这些因素中的一个或组合可能有效。但是,我没有在复杂域中使用卡尔曼滤波器,所以让我知道它如何适用于您的情况。