Matlab:使用卡尔曼滤波器时如何确保协方差矩阵是正定的
Matlab : How do I ensure that the covariance matrix is positive definite when using Kalman Filter
对于复值数据,我发现很难确保协方差矩阵是正定的。举个例子,
P =
10.0000 +10.0000i 0 0
0 10.0000 +10.0000i 0
0 0 10.0000 +10.0000i
我可以使用 cholesky 或下面解释的特征值来检查 P 的正定性。
(一)
[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 的正定性。是否有 hack 或出路?非常感谢
检查复数矩阵的正定性:
首先,对 this question at math.stackexchange 的回答说:
A necessary and sufficient condition for a complex matrix A to be
positive definite is that the Hermitian part
A_H = 1/2·(A+A^H)
is positive definite,
where A^H
denotes the conjugate transpose.
为什么P矩阵变成non-positive定的:
然后,在为什么 P 丢失 "positive-definiteness" 的问题上,通常的罪魁祸首是浮点数 representation/arithmetic。
标准卡尔曼滤波算法可以在某些敏感操作中显示数值稳定性问题,因为在计算卡尔曼增益时取矩阵 S 的逆,或者在应用优化时使用简化表达式更新步骤的误差协方差 P+ = (I - K·H)·P-
.
还有其他错误来源,如错误的实现或使用错误的数据(例如定义 process/measure 本身不是正定的协方差矩阵)。
如何避免问题:
我将重点关注第一个错误来源:数值稳定性。
有许多常用的替代方法可以使卡尔曼滤波器更稳定并避免协方差矩阵问题:
- 在每次迭代中更正 P 中的小错误(formally not correct,但效果很好)。过去我已经成功地使用了带有实数矩阵的简单化
P = 1/2 (P + P')
,但是还有更复杂的方案。
- 使用 square-root Kalman filter 或任何其他提高稳定性的公式。由于它们保留并更新了 P 的一种平方根,因此不对称不再是问题。他们还减少了一般的正定问题。
- 转到 64 位 FP 算法。比使用单精度更稳定。
- 通过缩放一些变量来改进数值调节。数字之间的巨大差异会加剧不准确性,因此如果 P 将 10^+3 量级的对角线值与 10^-6 量级的其他值混合,则将后一个变量的单位更改为 micro-whatever 缩小差距。
使用一个或多个这些因素可能会奏效。但是,我没有在复杂域中使用卡尔曼滤波器,所以让我知道它如何适用于您的情况。
对于复值数据,我发现很难确保协方差矩阵是正定的。举个例子,
P =
10.0000 +10.0000i 0 0
0 10.0000 +10.0000i 0
0 0 10.0000 +10.0000i
我可以使用 cholesky 或下面解释的特征值来检查 P 的正定性。
(一)
[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 的正定性。是否有 hack 或出路?非常感谢
检查复数矩阵的正定性:
首先,对 this question at math.stackexchange 的回答说:
A necessary and sufficient condition for a complex matrix A to be positive definite is that the Hermitian part
A_H = 1/2·(A+A^H)
is positive definite, whereA^H
denotes the conjugate transpose.
为什么P矩阵变成non-positive定的:
然后,在为什么 P 丢失 "positive-definiteness" 的问题上,通常的罪魁祸首是浮点数 representation/arithmetic。
标准卡尔曼滤波算法可以在某些敏感操作中显示数值稳定性问题,因为在计算卡尔曼增益时取矩阵 S 的逆,或者在应用优化时使用简化表达式更新步骤的误差协方差 P+ = (I - K·H)·P-
.
还有其他错误来源,如错误的实现或使用错误的数据(例如定义 process/measure 本身不是正定的协方差矩阵)。
如何避免问题:
我将重点关注第一个错误来源:数值稳定性。 有许多常用的替代方法可以使卡尔曼滤波器更稳定并避免协方差矩阵问题:
- 在每次迭代中更正 P 中的小错误(formally not correct,但效果很好)。过去我已经成功地使用了带有实数矩阵的简单化
P = 1/2 (P + P')
,但是还有更复杂的方案。 - 使用 square-root Kalman filter 或任何其他提高稳定性的公式。由于它们保留并更新了 P 的一种平方根,因此不对称不再是问题。他们还减少了一般的正定问题。
- 转到 64 位 FP 算法。比使用单精度更稳定。
- 通过缩放一些变量来改进数值调节。数字之间的巨大差异会加剧不准确性,因此如果 P 将 10^+3 量级的对角线值与 10^-6 量级的其他值混合,则将后一个变量的单位更改为 micro-whatever 缩小差距。
使用一个或多个这些因素可能会奏效。但是,我没有在复杂域中使用卡尔曼滤波器,所以让我知道它如何适用于您的情况。