对于复值数据,我发现很难确保协方差矩阵是正定的。举个例子,
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的正定性。是否存在黑客攻击或出路?非常感谢你
答案 0 :(得分:2)
首先,对this question at math.stackexchange的回答说:
复杂矩阵A的必要和充分条件 肯定是Hermitian部分
A_H = 1/2·(A+A^H)
是肯定的, 其中A^H
表示共轭转置。
然后,关于为什么P失去其正定性"的问题,通常的罪魁祸首是浮点表示/算术。
标准卡尔曼滤波算法在某些敏感操作中可以显示数值稳定性问题,例如在计算卡尔曼增益时采用矩阵S的逆,或者在更新时将优化应用于使用简化表达式进行误差协方差步骤P+ = (I - K·H)·P-
。
还有其他错误来源,如错误的实现或使用错误的数据(例如,定义过程/度量协方差矩阵,而这些矩阵本身并不是正定的)。
我将关注第一个错误来源:数值稳定性。 通常使用许多替代方法来使卡尔曼滤波器更稳定并避免协方差矩阵问题:
P = 1/2 (P + P')
和真实的矩阵,但是有更多精心设计的方案。使用这些因素中的一个或组合可能有效。但是,我没有在复杂域中使用卡尔曼滤波器,所以让我知道它如何适用于您的情况。