定义
前面我写过矛盾方程的最小二乘解,是用正规方程来求解的。现在有一种新的算法,利用矩阵的最小二乘广义逆generalized least squares inverse来求最小二乘解,矩阵的最小二乘广义逆符号为
A
l
−
A_l^-
Al−,全体最小二乘广义逆的集合记为
A
{
1
,
3
}
A^{\{1,3\}}
A{1,3},这里的1和3是指穆尔-彭罗斯四大条件中的第一和第三条件,这四大条件是:
A
G
A
=
A
G
A
G
=
G
(
A
G
)
T
=
A
G
(
G
A
)
T
=
G
A
AGA=A\\ GAG=G\\ (AG)^T=AG\\ (GA)^T=GA
AGA=AGAG=G(AG)T=AG(GA)T=GA
获得了最小二乘逆之后,方程最小二乘的解就是
A
l
−
b
A_l^-\bold b
Al−b。
算法
计算最小二乘广义逆的方法不建议先求广义逆再求最小二乘的集合,那样计算太麻烦。其实有个最简单的算法,就是下面的公式:
A
l
−
=
(
A
T
A
)
−
A
T
A_l^-=(A^TA)^-A^T
Al−=(ATA)−AT
比如这个矩阵的一个最小二乘广义逆就是:
A
=
(
1
1
2
2
2
1
3
3
3
)
A
l
−
=
(
−
0.444
0.556
0.111
0
0
0
0.556
−
0.444
0.111
)
A
A
l
−
=
(
0.667
−
0.333
0.333
−
0.333
0.667
0.333
0.333
0.333
0.667
)
A=\begin{pmatrix}1 & 1 & 2\\ 2 & 2 & 1\\ 3 & 3 & 3\\ \end{pmatrix}\\ A_l^-=\begin{pmatrix}-0.444 & 0.556 & 0.111\\ 0 & 0 & 0\\ 0.556 & -0.444 & 0.111\\ \end{pmatrix}\\ AA_l^-=\begin{pmatrix}0.667 & -0.333 & 0.333\\ -0.333 & 0.667 & 0.333\\ 0.333 & 0.333 & 0.667\\ \end{pmatrix}
A=
123123213
Al−=
−0.44400.5560.5560−0.4440.11100.111
AAl−=
0.667−0.3330.333−0.3330.6670.3330.3330.3330.667
python
广义逆的代码确定后,最小二乘广义逆的代码就非常简单了:
# 最小二乘广义逆
def gls_inverse(self):
a_t = self.transpose_matrix()
return (a_t * self).one_inverse() * a_t