5.3 递归最小二乘法
前面最小二乘法中数据是一次全部测量好,然后进行求解。但实际中有时存在测量数据是在线获得的,即时刻获得测量数据。比如无人驾驶车辆,需要实时判断前面车辆的运动状态,获取其加速度,所以每时每刻都需要进行测量。当每次获得新的测量数据后,需要进行最小二乘法以更新车辆状态。如果每次更新时,都采用公式
x
^
=
(
A
T
A
)
−
1
A
T
b
\mathbf{\hat{x}} = (A^TA)^{-1}A^T\mathbf{b}
x ^ = ( A T A ) − 1 A T b 进行更新,即采用所有数据进行计算,则当测量次数很多时,计算量很大,效率很低,且需要保存所有测量数据。我们可以采用递归方式,每次利用新测量数据对结果继续修正,极大减小计算量和存储量。
为了使记号简洁,我们令
x
^
m
\mathbf{\hat{x}_m}
x ^ m 表示用前
m
m
m 次测量数据得到的最优近似解。我们计算
A
T
A
A^TA
A T A ,此时需要把矩阵
A
A
A 看作行向量组,即
A
=
[
a
r
1
T
a
r
2
T
⋮
a
r
m
T
]
A = \left[ \begin{matrix} \mathbf{a^T_{r1}} \\ \mathbf{a^T_{r2}} \\ \vdots \\ \mathbf{a^T_{rm}} \end{matrix} \right]
A = ⎣ ⎢ ⎢ ⎢ ⎡ a r 1 T a r 2 T ⋮ a r m T ⎦ ⎥ ⎥ ⎥ ⎤ ,每一行对应一次测量数据,总共
m
m
m 次测量,则
A
T
A
=
[
a
r
1
,
a
r
2
,
⋯
,
a
r
m
]
[
a
r
1
T
a
r
2
T
⋮
a
r
m
T
]
=
a
r
1
a
r
1
T
+
a
r
2
a
r
2
T
+
⋯
+
a
r
m
a
r
m
T
A^TA= \left[ \begin{matrix} \mathbf{a_{r1}} , \mathbf{a_{r2}}, \cdots , \mathbf{a_{rm}} \end{matrix} \right] \left[ \begin{matrix} \mathbf{a^T_{r1}} \\ \mathbf{a^T_{r2}} \\ \vdots \\ \mathbf{a^T_{rm}} \end{matrix} \right]= \mathbf{a_{r1}}\mathbf{a^T_{r1}} + \mathbf{a_{r2}}\mathbf{a^T_{r2}} + \cdots + \mathbf{a_{rm}}\mathbf{a^T_{rm}}
A T A = [ a r 1 , a r 2 , ⋯ , a r m ] ⎣ ⎢ ⎢ ⎢ ⎡ a r 1 T a r 2 T ⋮ a r m T ⎦ ⎥ ⎥ ⎥ ⎤ = a r 1 a r 1 T + a r 2 a r 2 T + ⋯ + a r m a r m T
令
P
m
=
(
A
T
A
)
m
−
1
P_m = (A^TA)_m^{-1}
P m = ( A T A ) m − 1 表示用前
m
m
m 次测量数据得到的矩阵,则
P
m
=
(
a
r
1
a
r
1
T
+
⋯
+
a
r
(
m
−
1
)
a
r
(
m
−
1
)
T
+
a
r
m
a
r
m
T
)
−
1
=
(
P
m
−
1
−
1
+
a
r
m
a
r
m
T
)
−
1
P_{m} = (\mathbf{a_{r1}}\mathbf{a^T_{r1}} + \cdots + \mathbf{a_{r(m-1)}}\mathbf{a^T_{r(m-1)}} + \mathbf{a_{rm}}\mathbf{a^T_{rm}} )^{-1}=(P_{m-1}^{-1}+\mathbf{a_{rm}}\mathbf{a^T_{rm}})^{-1}
P m = ( a r 1 a r 1 T + ⋯ + a r ( m − 1 ) a r ( m − 1 ) T + a r m a r m T ) − 1 = ( P m − 1 − 1 + a r m a r m T ) − 1
A
T
b
=
[
a
r
1
,
a
r
2
,
⋯
,
a
r
m
]
[
b
1
b
2
⋮
b
m
]
=
b
1
a
r
1
+
b
2
a
r
2
+
⋯
+
b
m
a
r
m
A^T\mathbf{b} = \left[ \begin{matrix} \mathbf{a_{r1}} , \mathbf{a_{r2}}, \cdots , \mathbf{a_{rm}} \end{matrix} \right] \left[ \begin{matrix} b_1 \\ b_2 \\ \vdots \\ b_m \end{matrix} \right]= b_1\mathbf{a_{r1}} + b_2\mathbf{a_{r2}} + \cdots + b_m\mathbf{a_{rm}}
A T b = [ a r 1 , a r 2 , ⋯ , a r m ] ⎣ ⎢ ⎢ ⎢ ⎡ b 1 b 2 ⋮ b m ⎦ ⎥ ⎥ ⎥ ⎤ = b 1 a r 1 + b 2 a r 2 + ⋯ + b m a r m
令
B
m
=
(
A
T
b
)
m
B_m = (A^T\mathbf{b})_m
B m = ( A T b ) m 表示用前
m
m
m 次测量数据得到的向量,则
B
m
=
b
1
a
r
1
+
⋯
+
b
m
−
1
a
r
(
m
−
1
)
+
b
m
a
r
m
=
B
m
−
1
+
b
m
a
r
m
B_{m} = b_1\mathbf{a_{r1}} + \cdots + b_{m-1}\mathbf{a_{r(m-1)}} + b_m\mathbf{a_{rm}} = B_{m-1} + b_m\mathbf{a_{rm}}
B m = b 1 a r 1 + ⋯ + b m − 1 a r ( m − 1 ) + b m a r m = B m − 1 + b m a r m
根据公式
x
^
=
(
A
T
A
)
−
1
A
T
b
\mathbf{\hat{x}} = (A^TA)^{-1}A^T\mathbf{b}
x ^ = ( A T A ) − 1 A T b ,得利用
m
m
m 次测量数据的公式为
x
^
m
=
P
m
B
m
=
(
P
m
−
1
−
1
+
a
r
m
a
r
m
T
)
−
1
(
B
m
−
1
+
b
m
a
r
m
)
\mathbf{\hat{x}_{m}} = P_{m}B_{m} = (P_{m-1}^{-1}+\mathbf{a_{rm}}\mathbf{a^T_{rm}})^{-1}(B_{m-1} + b_{m}\mathbf{a_{rm}})
x ^ m = P m B m = ( P m − 1 − 1 + a r m a r m T ) − 1 ( B m − 1 + b m a r m )
这就是获得第
m
m
m 次测量数据后的更新公式,不需要全部从零计算所有数据,只需保存前
m
−
1
m-1
m − 1 次测量数据获得的矩阵
P
m
−
1
−
1
P_{m-1}^{-1}
P m − 1 − 1 和向量
B
m
−
1
B_{m-1}
B m − 1 即可,计算量也很少。
根据
x
^
m
=
P
m
B
m
\mathbf{\hat{x}_{m}} = P_{m}B_{m}
x ^ m = P m B m 得
B
m
−
1
=
P
m
−
1
−
1
x
^
m
−
1
B_{m-1} = P_{m-1}^{-1}\mathbf{\hat{x}_{m-1}}
B m − 1 = P m − 1 − 1 x ^ m − 1 ,
P
m
−
1
=
P
m
−
1
−
1
+
a
r
m
a
r
m
T
P_{m}^{-1} =P_{m-1}^{-1}+\mathbf{a_{rm}}\mathbf{a^T_{rm}}
P m − 1 = P m − 1 − 1 + a r m a r m T 带入上式得
x
^
m
=
P
m
(
P
m
−
1
−
1
x
^
m
−
1
+
b
m
a
r
m
)
=
P
m
(
(
P
m
−
1
−
a
r
m
a
r
m
T
)
x
^
m
−
1
+
b
m
a
r
m
)
=
x
^
m
−
1
+
P
m
a
r
m
(
b
m
−
a
r
m
T
x
^
m
−
1
)
\mathbf{\hat{x}_{m}} = P_{m}(P_{m-1}^{-1}\mathbf{\hat{x}_{m-1}} + b_{m}\mathbf{a_{rm}})\\=P_{m}( (P_{m}^{-1}-\mathbf{a_{rm}}\mathbf{a^T_{rm}})\mathbf{\hat{x}_{m-1}} + b_{m}\mathbf{a_{rm}} )\\=\mathbf{\hat{x}_{m-1}}+P_{m}\mathbf{a_{rm}}(b_{m}-\mathbf{a^T_{rm}}\mathbf{\hat{x}_{m-1}})
x ^ m = P m ( P m − 1 − 1 x ^ m − 1 + b m a r m ) = P m ( ( P m − 1 − a r m a r m T ) x ^ m − 1 + b m a r m ) = x ^ m − 1 + P m a r m ( b m − a r m T x ^ m − 1 )
这就是最优近似解的递归公式。
递归公式中
P
m
=
(
P
m
−
1
−
1
+
a
r
m
a
r
m
T
)
−
1
P_{m} = (P_{m-1}^{-1}+\mathbf{a_{rm}}\mathbf{a^T_{rm}})^{-1}
P m = ( P m − 1 − 1 + a r m a r m T ) − 1 需要计算逆矩阵,进一步化简,利用公式
(
A
+
B
C
D
)
−
1
=
A
−
1
−
A
−
1
B
(
C
−
1
+
D
A
−
1
B
)
−
1
D
A
−
1
(A+BCD)^{-1}=A^{-1}-A^{-1}B(C^{-1}+DA^{-1}B)^{-1}DA^{-1}
( A + B C D ) − 1 = A − 1 − A − 1 B ( C − 1 + D A − 1 B ) − 1 D A − 1 最后可得
x
^
m
=
x
^
m
−
1
+
K
m
ϵ
m
ϵ
m
=
b
m
−
a
r
m
T
x
^
m
−
1
K
m
=
P
m
a
r
m
P
m
=
P
m
−
1
−
P
m
−
1
a
r
m
a
r
m
T
P
m
−
1
1
+
a
r
m
T
P
m
−
1
a
r
m
\mathbf{\hat{x}_{m}} =\mathbf{\hat{x}_{m-1}}+K_{m}\epsilon_{m}\\ \epsilon_{m} = b_{m}-\mathbf{a^T_{rm}}\mathbf{\hat{x}_{m-1}}\\ K_{m} = P_{m}\mathbf{a_{rm}}\\ P_{m} = P_{m-1} - \frac {P_{m-1}\mathbf{a_{rm}}\mathbf{a^T_{rm}}P_{m-1}}{1+\mathbf{a^T_{rm}}P_{m-1}\mathbf{a_{rm}}}
x ^ m = x ^ m − 1 + K m ϵ m ϵ m = b m − a r m T x ^ m − 1 K m = P m a r m P m = P m − 1 − 1 + a r m T P m − 1 a r m P m − 1 a r m a r m T P m − 1
时间衰减递归最小二乘法
递归最小二乘法中所有测量数据重要性都是一样的,这样可能会带来一个问题。还是以无人驾驶车辆实时判断前面车辆的运动状态为例,我们假设前面车辆做匀加速运动,实际上车辆运动状态时刻会发生变化,时而加速时而减速(这称为机动性),故为了准确获取车辆当前状态,当前数据的重要性,显然要大于历史数据,不能同等对待。而递归最小二乘法却同等对待,故最优近似解更新速度慢,不能实时反映车辆运作状态的改变,会慢半拍。如何提高当前数据的重要性,同时又不导致计算复杂度的增加,本节提出一种方法。根据
P
m
=
P
m
−
1
−
P
m
−
1
a
r
m
a
r
m
T
P
m
−
1
1
+
a
r
m
T
P
m
−
1
a
r
m
P_{m} = P_{m-1} - \frac {P_{m-1}\mathbf{a_{rm}}\mathbf{a^T_{rm}}P_{m-1}}{1+\mathbf{a^T_{rm}}P_{m-1}\mathbf{a_{rm}}}
P m = P m − 1 − 1 + a r m T P m − 1 a r m P m − 1 a r m a r m T P m − 1 得
K
m
=
P
m
a
r
m
=
P
m
−
1
a
r
m
1
+
a
r
m
T
P
m
−
1
a
r
m
K_{m} = P_{m}\mathbf{a_{rm}} = \frac {P_{m-1}\mathbf{a_{rm}}}{1+\mathbf{a^T_{rm}}P_{m-1}\mathbf{a_{rm}}}
K m = P m a r m = 1 + a r m T P m − 1 a r m P m − 1 a r m
最优近似解的更新量为
K
m
ϵ
m
K_{m}\epsilon_{m}
K m ϵ m ,为了提高最新测量的权重,我们对
K
m
K_{m}
K m 进行修正为
K
m
=
P
m
−
1
a
r
m
1
/
κ
+
a
r
m
T
P
m
−
1
a
r
m
,
κ
≥
1
K_{m} = \frac {P_{m-1}\mathbf{a_{rm}}}{1/\kappa+\mathbf{a^T_{rm}}P_{m-1}\mathbf{a_{rm}}} ,\kappa \ge 1
K m = 1 / κ + a r m T P m − 1 a r m P m − 1 a r m , κ ≥ 1
修正系数
κ
\kappa
κ 越大,最新测量的权重越大,历史数据的作用衰减越快,最优解能快速跟踪系统。但
κ
\kappa
κ 越大,如果车辆运作状态没有改变,则会增大最优近似解的误差;
κ
\kappa
κ 小,如果车辆运作状态发生改变,则最优近似解不能快速跟随车辆状态的改变。所以最理想的情况是,先判断车辆运动状态是否发生改变,如果发生,则增大
κ
\kappa
κ ,否则可以令
κ
=
1
\kappa=1
κ = 1 。