赞
踩
当线性方程组无解时,如何寻求一个最精确解,以贴合在坐标系中离散的坐标点。
给出三个笛卡尔坐标系下的坐标点:
(
1
,
0
)(
2
,
0
)(
1
,
2
)
(1,0)(2,0)(1,2)
(1,0)(2,0)(1,2)
找到一条直线
y
=
k
x
+
b
y=kx+b
y=kx+b,能够贴合这三点(显然不可能)。为表述方便,以
x
1
x₁
x1代
k
k
k,
x
2
x₂
x2 代
b
b
b,
得到以下方程组:
{
1
×
k
+
b
=
0
2
×
k
+
b
=
0
1
×
k
+
b
=
2
⇔
{
1
×
x
1
+
x
2
=
0
2
×
x
1
+
x
2
=
0
1
×
x
1
+
x
2
=
2
\left\{
将线性方程组写成矩阵形式:
A
=
[
1
1
2
1
1
1
]
b
=
[
0
0
2
]
得出矩阵符合关系式:
A
x
=
b
Ax=b
Ax=b,而我们的目的则是求得一个原始列向量:
x
=
[
x
1
x
2
]
(1)
根据矩阵
A
=
[
1
1
2
1
1
1
]
由
r
<
m
,
且
n
=
r
r<m,且n=r
r<m,且n=r可知:线性方程组无解,或存在唯一解。
(2)
由于向量b=
[
0
0
2
]
综上所述可知,线性方程组无解,准确来说,无精确解。
由线性方程组
A
x
=
b
,即可以得到矩阵
Ax=b,即可以得到矩阵
Ax=b,即可以得到矩阵
A
=
[
1
1
2
1
1
1
]
a
1
=
[
1
2
1
]
a
2
=
[
1
1
1
]
这两个向量张成
R
3
R^3
R3空间中的一个二维空间,即矩阵A的列空间
C
(
A
)
C(A)
C(A)。由于向量
b
=
[
0
0
2
]
虽然线性方程组
A
x
=
b
Ax=b
Ax=b不存在精确解,但我们可以寻求距离目标最近的近似解。根据上图,我们可以直观的思考到一个合理的方法——从向量
b
b
b向二维空间即列空间
C
(
A
)
C(A)
C(A)上引垂线,得到
b
b
b的投影向量
p
p
p。由
p
p
p和
b
b
b可得误差向量
e
=
b
−
p
e=b-p
e=b−p。
向量
b
b
b经“某一矩阵”变换后,可得位于列空间
C
(
A
)
C(A)
C(A)上的投影向量
p
p
p。而“某一矩阵”则称为“投影矩阵”。我们可以得到关系式:
p
=
P
b
p=Pb
p=Pb
引出投影向量
p
p
p后,问题就清晰了,我们可以求出
p
p
p向量来近似求解方程
A
x
^
=
p
A\hat{x}=p
Ax^=p对应
x
=
[
x
1
x
2
]
由上图可知
p
p
p向量的两个性质:
(1)
p
p
p向量位于列空间
C
(
A
)
C(A)
C(A)上,即
A
x
^
=
p
A\hat{x}=p
Ax^=p。
A
x
^
=
[
a
1
a
2
]
[
x
1
^
x
2
^
]
=
p
A\hat{x}=
(2)
误差向量垂直于二维空间
C
(
A
)
C(A)
C(A)的任一组向量。
a
1
・
e
=
0
和
a
2
・
e
=
0
a_1・e=0和a_2・e=0
a1・e=0和a2・e=0
将
{
e
=
b
−
p
p
=
A
x
^
\left\{
{
a
1
e
=
a
1
(
b
−
p
)
=
a
1
(
b
−
A
x
^
)
=
0
a
2
e
=
a
2
(
b
−
p
)
=
a
2
(
b
−
A
x
^
)
=
0
\left \{
{
a
1
T
(
b
−
A
x
^
)
=
0
a
2
T
(
b
−
A
x
^
)
=
0
\left \{
整理得:
[
a
1
T
a
2
T
]
(
b
−
A
x
^
)
=
0
A
=
[
a
1
a
2
]
则
[
a
1
T
a
2
T
]
=
A
T
⇒
x
^
=
(
A
T
A
)
−
1
A
T
b
\hat{x}=(A^TA)^{-1}A^Tb
x^=(ATA)−1ATb
将上式代入
p
=
A
x
^
p=A\hat{x}
p=Ax^,得:
p
=
A
・
(
A
T
A
)
−
1
A
T
b
p=A・(A^TA)^{-1}A^Tb
p=A・(ATA)−1ATb
代入
p
=
P
b
p=Pb
p=Pb,得:
P
=
A
・
(
A
T
A
)
−
1
A
P=A・(A^TA)^{-1}A
P=A・(ATA)−1A
公式汇总:
{
x
^
=
(
A
T
A
)
−
1
A
T
b
p
=
A
・
(
A
T
A
)
−
1
A
T
b
P
=
A
・
(
A
T
A
)
−
1
A
\left\{
最小二乘法的几何意义是高维空间中的一个向量在低维空间上的投影。
代码
import numpy as np from scipy import linalg A=np.array([[1,1], [2,1], [1,1]]) b=np.array([0,0,2]) A_T_A=np.dot(A.T,A) A_T_A_in=linalg.inv(A_T_A) x_hat=np.dot(np.dot(A_T_A_in,A.T),b) p=np.dot(A,x_hat) p_matrix=np.dot(A,np.dot(A_T_A_in,A.T)) print("近似解x为:") print(x_hat) print("\n投影向量p为:") print(p) print("\n投影矩阵P为:") print(p_matrix)
运行结果
近似解x为:
[-1. 2.]
投影向量p为:
[1. 0. 1.]
投影矩阵P为:
[[0.5 0. 0.5]
[0. 1. 0. ]
[0.5 0. 0.5]]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。