[透彻理解]由最小二乘到SVD分解
文章目录
借鉴的材料:
https://www.cnblogs.com/hxjbc/p/7443630.html
https://blog.csdn.net/macer3/article/details/48394239/
https://zhuanlan.zhihu.com/p/57803955
前言:最近在整理项目资料,其中有一个三维点云地面部分的提取。关于其理论,在此做一个整理。
1 问题引入:二维直线的拟合问题
假设我们有:
A
:
(
1
,
2
)
,
B
:
(
0
,
2
)
,
C
:
(
2
,
3
)
A:(1,2),B:(0,2),C:(2,3)
A:(1,2),B:(0,2),C:(2,3)三个点,现在需要对这个三个点拟合一条直线。
设这条直线的方程为
y
=
a
x
+
b
y=ax+b
y=ax+b 。我们希望这条直线可以同时通过这三个点,也就是这条直线的参数要满足:
{
1
×
k
+
b
=
2
0
×
k
+
b
=
2
2
×
k
+
b
=
3
\left\{ \begin{array}{l} 1 \times k + b = 2\\ 0 \times k + b = 2\\ 2 \times k + b = 3 \end{array} \right.
⎩⎨⎧1×k+b=20×k+b=22×k+b=3
这是一个超定方程。为了后面表示方便,在这里我们用
x
1
,
x
2
x_1,x_2
x1,x2来代替
k
,
b
k,b
k,b。
{
1
×
x
1
+
x
2
=
2
0
×
x
1
+
x
2
=
2
2
×
x
1
+
x
2
=
3
\left\{ \begin{array}{l} 1 \times {x_1} + {x_2} = 2\\ 0 \times {x_1} + {x_2} = 2\\ 2 \times {x_1} + {x_2} = 3 \end{array} \right.
⎩⎨⎧1×x1+x2=20×x1+x2=22×x1+x2=3
写成矩阵的形式:
[
1
1
0
1
2
1
]
[
x
1
x
2
]
=
[
2
2
3
]
↑
↑
↑
A
×
x
=
b
\begin{array}{l} \left[ \begin{array}{l} 1\,\,\,\,1\\ 0\,\,\,1\\ 2\,\,\,1 \end{array} \right]\left[ \begin{array}{l} {x_1}\\ {x_2} \end{array} \right] = \left[ \begin{array}{l} 2\\ 2\\ 3 \end{array} \right]\\ \,\,\,\,\,\,\,\,\, \uparrow \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, \uparrow \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, \uparrow \\ \,\,\,\,\,\,\,A\,\,\, \times \,\,\,\,\,\,x\,\,\,\,\,\, = \,\,\,\,\,\,\,b\,\, \end{array}
⎣⎡110121⎦⎤[x1x2]=⎣⎡223⎦⎤↑↑↑A×x=b
这即是我们要优化的非齐次线性方程组
A
x
=
b
Ax=b
Ax=b。
为了方便我们接下来的理解,现在将其拆分成下面这种形式:
[
1
0
2
]
×
x
1
+
[
1
1
1
]
×
x
2
=
[
2
2
3
]
↑
↑
↑
a
1
×
x
1
+
a
2
×
x
2
=
b
\begin{array}{l} \left[ \begin{array}{l} 1\\0\\2 \end{array} \right] \times {x_1} + \left[ \begin{array}{l} 1\\1\\1 \end{array} \right] \times {x_2} = \left[ \begin{array}{l} 2\\2\\3 \end{array} \right]{\mkern 1mu} \\ {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} \uparrow {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} \,\,\,\,\,\,\,\,\,\,{\mkern 1mu} {\mkern 1mu} {\mkern 1mu} \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\uparrow {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} \,\,\,\,\,\,\,\,\,\,{\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} \,\,\,\,\,\,\,\,\,\,\,\,\uparrow \\ {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {a_1}{\mkern 1mu} {\mkern 1mu} \,\, \,\,\,\,\times \,\,\,\,{x_1}{\mkern 1mu} \, + {\mkern 1mu} {\mkern 1mu} \,\,{a_2}{\mkern 1mu} \times {x_2}{\mkern 1mu} {\mkern 1mu} = {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} \,\,\,\,b \end{array}
⎣⎡102⎦⎤×x1+⎣⎡111⎦⎤×x2=⎣⎡223⎦⎤↑↑↑a1×x1+a2×x2=b
这里的理解方式是,两个3维向量,经过
x
1
x_1
x1和
x
2
x_2
x2的线性组合之后,得到
b
b
b向量。
这里更高级一点的说法是,在以 a 1 , a 2 a_1,a_2 a1,a2为基向量(3维)所张成的2维子空间上,寻找最接近 b b b向量的向量。
把
a
1
,
a
2
a_1,a_2
a1,a2视作基向量,画图理解。
由这个图可知,公式(4)肯定是不成立的,因为向量
b
b
b(红色)就不在基向量
a
1
,
a
2
a_1,a_2
a1,a2所张成的二维平面(二维子空间)里。
所以,我们在这里退而求其次,在该二维子空间中找一个向量 b ′ b' b′(由基向量组成 b ′ = x 1 ∗ a 1 + x 2 ∗ a 2 b'=x_1*a_1+x_2*a_2 b′=x1∗a1+x2∗a2),来代替向量 b b b,但是这个向量距离 b ′ b' b′到向量 b b b的距离最短(如下图所示)
如图所示,
O
E
=
b
′
,
O
D
=
b
OE=b',OD=b
OE=b′,OD=b,显而易见,
b
′
b'
b′是
b
b
b向此二维平面的正交投影,此时
b
′
b'
b′和
b
b
b之间的距离最近,距离差值维
D
E
DE
DE的长度。
而此时 b ′ = x 1 ∗ a 1 + x 2 ∗ a 2 = x 1 O C + x 2 O B b'=x_1*a_1+x_2*a_2=x_1OC+x_2OB b′=x1∗a1+x2∗a2=x1OC+x2OB, x 1 , x 2 x_1,x_2 x1,x2就是我们需要求出的值。
更进一步的理解。当有n组数据带入时,A矩阵的维度将会是n×2.那么这里整个最小二乘拟合问题就可以理解成: a 1 , a 2 a_1,a_2 a1,a2是n维线性空间中的两个线性无关的向量,在span{ a 1 , a 2 a_1,a_2 a1,a2}所张成的子空间中(2维)找到 b b b在其中的正交投影 b ′ b' b′,二者之间的距离即是最小二乘优化的最小值min。 b ′ b' b′在基 a 1 , a 2 a_1,a_2 a1,a2上的投影,即是要求解的变量值,
如果需要拟合的变量不止2个,假设有m个,那么整个问题就可以理解成是n维向量到m维超平面的正交投影求解。
回到公式(3)中来,对其的求解,有以下方法。
A
x
=
b
A
T
A
x
=
A
T
b
x
=
(
A
T
A
)
−
1
A
T
b
Ax=b \\ A^{T} A x=A^{T}b \\ x=(A^{T} A)^{-1}A^{T}b
Ax=bATAx=ATbx=(ATA)−1ATb
按照道理来说,此时我们已经解决问题了。但是众所周知,对于高维度的矩阵,计算机进行求逆操作是非常慢的,问题就出在实际应用中,点云地面的拟合,可能是几千上万个点,这样就会导致A矩阵的维度很高,显然直接求逆操作在此时是不可行的。所以,如何快速求解
A
x
=
b
Ax=b
Ax=b是下一个要解决的问题,即SVD分解。
2 实际问题1:点云的地面拟合
2.1 解法1.分解协方差矩阵
其算法理论基于论文:Zermas, D., Izzat, I., & Papanikolopoulos, N. (2017). Fast segmentation of 3D point clouds: A paradigm on LiDAR data for autonomous vehicle applications. Proceedings - IEEE International Conference on Robotics and Automation, 5067–5073. https://doi.org/10.1109/ICRA.2017.7989591
求证:平面Ax+By+Cz+D=0的法向量为(A,B,C).
证明:假设 ( x 1 , y 1 , z 1 ) , ( x 2 , y 2 , z 2 ) (x_1,y_1,z_1),(x_2,y_2,z_2) (x1,y1,z1),(x2,y2,z2)是当前平面上的两个点。
则有: A x 1 + B y 1 + C z 1 + D = 0 Ax_1+By_1+Cz_1+D=0 Ax1+By1+Cz1+D=0, A x 2 + B y 2 + C z 2 + D = 0 Ax_2+By_2+Cz_2+D=0 Ax2+By2+Cz2+D=0,所以两式相减,可得:
A ( x 1 − x 2 ) + B ( y 1 − y 2 ) + C ( z 1 − z 2 ) = 0 A(x_1-x_2)+B(y_1-y_2)+C(z_1-z_2)=0 A(x1−x2)+B(y1−y2)+C(z1−z2)=0,即
[ A B C ] [ ( x 1 − x 2 ) ( y 1 − y 2 ) ( z 1 − z 2 ) ] = 0 \left[ \begin{matrix} A & B & C \end{matrix} \right] \left[ \begin{matrix} (x_1-x_2) \\ (y_1-y_2) \\ (z_1-z_2) \end{matrix} \right] =0 [ABC]⎣⎡(x1−x2)(y1−y2)(z1−z2)⎦⎤=0
右边的矩阵表示平面上的任一点,且该式对平面上的任意两点都成立。所以 n = ( A , B , C ) n=(A,B,C) n=(A,B,C)即是所在平面的法向量。
对靠近地面的的n个点,计算其协方差矩阵。对协方差矩阵进行SVD分解,可以得到对应的特征值和特征向量。其中,最小特征值对应的特征向量就是地面平面的法向量。
目的:拟合地面所在的方程Ax+By+Cz+d=0
- 取n个z值最小的点,认为其是地面点
取n个地面点,计算这n个点的协方差矩阵 C o v Cov Cov,然后对其做SVD分解,得到其在各个分量。最小奇异值所对应的向量便是地面的法向量 n n n.
由前面的证明可知: n = ( A , B , C ) n=(A,B,C) n=(A,B,C)
- 对n个靠近地面的点遍历加和,计算一个均值
X
ˉ
=
(
x
ˉ
,
y
ˉ
,
z
ˉ
)
\bar X=(\bar x,\bar y,\bar z)
Xˉ=(xˉ,yˉ,zˉ)。认为此均值带入地面所在方程
A x ˉ + B y ˉ + C z ˉ + D ≈ 0 即 : A x ˉ + B y ˉ + C z ˉ ≈ − D A\bar x+B\bar y+C\bar z+D≈0 \\ 即:A\bar x+B\bar y+C\bar z≈-D Axˉ+Byˉ+Czˉ+D≈0即:Axˉ+Byˉ+Czˉ≈−D
此时 − D -D −D的值已知。
此时,均值
X
ˉ
\bar X
Xˉ因为是n个点的均值,默认是最靠近地面所在平面的点。其他所有的n个点,都可以认为更偏离所拟合的平面。即:
A
x
ˉ
+
B
y
ˉ
+
C
z
ˉ
+
D
±
δ
≈
0
即
:
A
x
ˉ
+
B
y
ˉ
+
C
z
ˉ
≈
−
D
±
δ
A\bar x+B\bar y+C\bar z+D \pm \delta≈0 \\ 即:A\bar x+B\bar y+C\bar z≈-D \pm \delta
Axˉ+Byˉ+Czˉ+D±δ≈0即:Axˉ+Byˉ+Czˉ≈−D±δ
因此,在对\velodyne_points
中所有的topic进行筛选地面点的过程中,所有的点
X
i
=
(
x
i
,
y
i
,
z
i
)
X_i=(x_i,y_i,z_i)
Xi=(xi,yi,zi)带入式(3)所得到的值符合以下约束:
A
x
i
+
B
y
i
+
C
z
i
∈
[
−
D
−
δ
,
−
D
+
δ
]
Ax_i+By_i+Cz_i \in [-D - \delta,-D+\delta]
Axi+Byi+Czi∈[−D−δ,−D+δ]
此时,
δ
\delta
δ的值需要自己设定,代表了对地面点的筛选条件。
2.2 解法2 SVD 求解Ax=0
此方法类似于二维平面的直线拟合。
假设我们有 n n n个( n > > 4 n>>4 n>>4)靠近地面的点,现假设地面平面所在的方程为 a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0。利用这 n n n个点对该平面方程的参数进行拟合。原理与二维平面的直线拟合类似,这里不做过多推导。
带入
n
n
n个点的坐标,可得:
{
a
x
1
+
b
y
1
+
c
z
1
+
d
=
0
a
x
2
+
b
y
2
+
c
z
2
+
d
=
0
a
x
3
+
b
y
3
+
c
z
3
+
d
=
0
.
.
.
a
x
n
+
b
y
n
+
c
z
n
+
d
=
0
\left\{ \begin{array}{l} ax_1+by_1+cz_1+d=0 \\ ax_2+by_2+cz_2+d=0 \\ ax_3+by_3+cz_3+d=0 \\ ...\\ ax_n+by_n+cz_n+d=0 \end{array} \right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧ax1+by1+cz1+d=0ax2+by2+cz2+d=0ax3+by3+cz3+d=0...axn+byn+czn+d=0
即可化为以下
A
x
=
0
Ax=0
Ax=0的齐次方程组形式(超定方程)。
[
x
1
y
1
z
1
1
x
2
y
2
z
2
1
.
.
.
x
n
y
n
z
n
1
]
n
∗
4
[
a
b
c
d
]
4
∗
1
=
0
\left[ \begin{matrix} x_1 & y_1 & z_1 & 1 \\ x_2 & y_2 & z_2 & 1 \\ \ & \ ... \ & & \\ x_n & y_n & z_n & 1 \\ \end{matrix} \right]_{n*4} \left[ \begin{matrix} a \\ b \\ c \\ d \end{matrix} \right]_{4*1} =0
⎣⎢⎢⎡x1x2 xny1y2 ... ynz1z2zn111⎦⎥⎥⎤n∗4⎣⎢⎢⎡abcd⎦⎥⎥⎤4∗1=0
对矩阵
A
A
A进行SVD即可得最后的结果。
问题:这种方法存在 [ a b c d ] [a \ b \ c \ d] [a b c d]的尺度问题。因为是齐次方程,其值可以任意缩放,带来的问题就是实际应用筛选地面点的过程中,不同的缩放系数会导致筛选阈值不确定性。这里建议根据实际分割效果做多次实验决定。
2.3 证明:SVD=最小二乘
D P w = 0 即 A x = 0 DP_w=0 \\ 即Ax=0 DPw=0即Ax=0
D P w = 0 即 A x = 0 DP_w=0 \\ 即Ax=0 DPw=0即Ax=0
下面以 A x = 0 Ax=0 Ax=0这种更普遍的表达形式进行推导。
当
A
m
∗
n
A_{m*n}
Am∗n是一个超定方程的时候,此等式无解,因此需要取最小二乘的形式,即:
m
i
n
∣
∣
A
x
∣
∣
2
2
=
m
i
n
(
x
T
A
T
A
x
)
s
b
j
.
∣
∣
x
∣
∣
=
1
min ||Ax||_2^2 \\ =min \ (x^{T}A^{T}Ax)\\ sbj.||x||=1
min∣∣Ax∣∣22=min (xTATAx)sbj.∣∣x∣∣=1
已知:
A
T
A
=
V
Λ
V
T
A
=
U
Σ
V
T
,
A
T
=
V
Σ
T
U
T
U
T
U
=
V
T
V
=
I
A^{T}A=V \Lambda V^T \\ A=U \Sigma V^{T} ,A^T=V \Sigma^T U^T\\ U^TU=V^TV=I \\
ATA=VΛVTA=UΣVT,AT=VΣTUTUTU=VTV=I
可得,
V
=
[
v
0
v
1
.
.
.
v
n
]
n
∗
n
V=[v_0 \ v_1 \ ... \ v_n]_{n*n}
V=[v0 v1 ... vn]n∗n是
n
n
n维空间里的标准正交基。所以
x
n
∗
1
x_{n*1}
xn∗1可以由此标准正交基构成,即:
x
=
k
0
v
0
+
k
1
v
1
+
.
.
.
+
k
n
v
n
=
∑
i
=
0
n
k
i
v
i
,
x
∈
R
n
s
b
j
.
∣
∣
x
∣
∣
=
1
x=k_0v_0+k_1v_1+...+k_nv_n=\sum_{i=0}^{n} k_iv_i \ ,x \in \mathbb R^{n}\\ sbj. \ ||x||=1
x=k0v0+k1v1+...+knvn=i=0∑nkivi ,x∈Rnsbj. ∣∣x∣∣=1
由公式(12)可知:
A
T
A
=
V
Σ
T
U
T
U
Σ
V
T
=
V
Σ
T
Σ
V
T
=
V
[
σ
m
a
x
2
⋱
σ
m
i
n
2
]
V
T
A^TA=V \Sigma^T U^T U \Sigma V^{T} \\ = V \Sigma^T \Sigma V^{T} \\ = V\left[ \begin{matrix} \sigma_{max}^2 & \ & \ \\ \ & \ddots & \ \\ \ & \ & \sigma_{min}^2 \end{matrix} \right]V^T \\
ATA=VΣTUTUΣVT=VΣTΣVT=V⎣⎡σmax2 ⋱ σmin2⎦⎤VT
将(13)(14)带入到(11)中,
m
i
n
=
x
T
[
v
0
.
.
.
v
n
]
[
σ
m
a
x
2
⋱
σ
m
i
n
2
]
[
v
0
T
.
.
.
v
n
T
]
x
=
x
T
[
v
0
.
.
.
v
n
]
[
σ
m
a
x
2
v
0
T
⋱
σ
m
i
n
2
v
n
T
]
x
=
x
T
[
σ
m
a
x
2
v
0
v
0
T
⋱
σ
m
i
n
2
v
n
v
n
T
]
x
=
x
T
[
σ
m
a
x
2
⋱
σ
m
i
n
2
]
x
=
x
T
[
σ
m
a
x
2
⋱
σ
m
i
n
2
]
x
=
[
k
0
v
0
.
.
.
k
n
v
n
]
[
σ
m
a
x
2
⋱
σ
m
i
n
2
]
[
k
0
v
0
T
.
.
.
k
n
v
n
T
]
=
k
0
2
σ
m
a
x
2
+
.
.
.
+
k
n
2
σ
m
i
n
2
=
σ
m
i
n
2
min=x^T [v_0 \ ... \ v_n]\left[ \begin{matrix} \sigma_{max}^2 & \ & \ \\ \ & \ddots & \ \\ \ & \ & \sigma_{min}^2 \end{matrix} \right]\left[ \begin{matrix}v_0^T \\... \\v_n^T \end{matrix} \right]x \\=x^T [v_0 \ ... \ v_n]\left[ \begin{matrix} \sigma_{max}^2v_0^T & \ & \ \\ \ & \ddots & \ \\ \ & \ & \sigma_{min}^2v_n^T \end{matrix} \right]x \\=x^T \left[ \begin{matrix} \sigma_{max}^2v_0v_0^T & \ & \ \\ \ & \ddots & \ \\ \ & \ & \sigma_{min}^2v_nv_n^T \end{matrix} \right]x \\=x^T \left[ \begin{matrix} \sigma_{max}^2 & \ & \ \\ \ & \ddots & \ \\ \ & \ & \sigma_{min}^2 \end{matrix} \right]x \\=x^T \left[ \begin{matrix} \sigma_{max}^2 & \ & \ \\ \ & \ddots & \ \\ \ & \ & \sigma_{min}^2 \end{matrix} \right]x \\=[k_0v_0 \ ... \ k_nv_n]\left[ \begin{matrix} \sigma_{max}^2 & \ & \ \\ \ & \ddots & \ \\ \ & \ & \sigma_{min}^2 \end{matrix} \right]\left[ \begin{matrix} k_0v_0^T \\... \\k_nv_n^T\end{matrix} \right] \\=k_0^2\sigma_{max}^{2} + ...+k_n^2\sigma_{min}^{2} \\=\sigma_{min}^{2}
min=xT[v0 ... vn]⎣⎡σmax2 ⋱ σmin2⎦⎤⎣⎡v0T...vnT⎦⎤x=xT[v0 ... vn]⎣⎡σmax2v0T ⋱ σmin2vnT⎦⎤x=xT⎣⎡σmax2v0v0T ⋱ σmin2vnvnT⎦⎤x=xT⎣⎡σmax2 ⋱ σmin2⎦⎤x=xT⎣⎡σmax2 ⋱ σmin2⎦⎤x=[k0v0 ... knvn]⎣⎡σmax2 ⋱ σmin2⎦⎤⎣⎡k0v0T...knvnT⎦⎤=k02σmax2+...+kn2σmin2=σmin2
上述情况中,
k
n
=
1
,
k
i
(
i
≠
n
)
=
0
\mathrm{k}_{n}=1, \quad \mathrm{k}_{\mathrm{i}}(i \neq n)=0
kn=1,ki(i=n)=0
此时,対应
x
=
k
n
v
n
=
v
n
x=k_nv_n=v_n
x=knvn=vn
3 实际问题2:三角化
假设世界中的某点 P w P_w Pw(世界坐标未知)被连续n帧相机数据观测到,像素坐标分别是 ( u 1 , v 1 ) , . . . , ( u n , v n ) (u_1,v_1),...,(u_n,v_n) (u1,v1),...,(un,vn).n帧对应的相机坐标 T w c 1 , . . . , T w c n T_{wc1},...,T_{wcn} Twc1,...,Twcn,皆已知。根据三角化,我们可以构建最小二乘表达式,综合 n n n帧观测数据,获得点 P w P_w Pw的位置。
预备推导:
P c i Pci Pci: P w P_w Pw在第 i i i帧相机坐标系 T w c i T_{wci} Twci下的坐标。
P c i = T c w i P w P_{ci}=T_{cwi}P_{w} Pci=TcwiPw
P w = T w c i P c i = a a P_{w}=T_{wci}P_{ci} \\ \ \ \ \ \ =aa Pw=TwciPci =aa
P c i = ( x c i , y c i , z c i ) = z c i ( x c i z c i , y c i z c i , 1 ) = λ i ( u i , v i , 1 ) = λ i p i P_{ci}=(x_{ci},y_{ci},z_{ci})=z_{ci}(\frac{x_{ci}}{z_{ci}},\frac{y_{ci}}{z_{ci}},1)=\lambda{i}(u_i,v_i,1)=\lambda_ip_i Pci=(xci,yci,zci)=zci(zcixci,zciyci,1)=λi(ui,vi,1)=λipi
其中, λ i \lambda_i λi是深度值, p i p_i pi是像素坐标
P w = T w c i P c i P w = T w c i λ i p i T c i w P w = λ i p i P_{w}=T_{wci}P_{ci} \\ P_{w}=T_{wci}\lambda_ip_i \\T_{ciw}P_w=\lambda_ip_i \\ Pw=TwciPciPw=TwciλipiTciwPw=λipi
展开成矩阵的形式:
λ
i
[
v
i
u
i
1
]
3
∗
1
=
[
[
R
c
w
]
3
∗
3
[
t
c
w
]
3
∗
1
]
3
∗
4
P
w
=
[
[
R
c
w
]
3
∗
3
[
t
c
w
]
3
∗
1
]
3
∗
4
[
x
w
y
w
z
w
1
]
4
∗
1
=
[
R
11
R
12
R
13
t
1
R
21
R
22
R
23
t
2
R
31
R
32
R
33
t
3
]
3
∗
3
[
x
w
y
w
z
w
1
]
4
∗
1
\lambda_i \left[ \begin{matrix} v_i \\ u_i \\ 1 \end{matrix} \right]_{3*1} = \left[ \begin{matrix}\left[ \begin{matrix} R_{cw} \end{matrix} \right]_{3*3}[t_{cw}]_{3*1} \end{matrix} \right]_{3*4}P_w \\ = \left[ \begin{matrix}\left[ \begin{matrix} R_{cw} \end{matrix} \right]_{3*3}[t_{cw}]_{3*1} \end{matrix} \right]_{3*4}\left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1 \end{matrix} \right]_{4*1} \\ = \left[ \begin{matrix} R_{11} & R_{12} & R_{13} & t_{1} \\ R_{21} & R_{22} & R_{23} & t_{2} \\ R_{31} & R_{32} & R_{33} & t_{3} \\ \end{matrix} \right]_{3*3} \left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1 \end{matrix} \right]_{4*1}
λi⎣⎡viui1⎦⎤3∗1=[[Rcw]3∗3[tcw]3∗1]3∗4Pw=[[Rcw]3∗3[tcw]3∗1]3∗4⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤4∗1=⎣⎡R11R21R31R12R22R32R13R23R33t1t2t3⎦⎤3∗3⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤4∗1
将其拆成行表示:
λ
i
u
i
=
[
R
1
t
1
]
P
w
=
1
∗
4
∗
4
∗
1
λ
i
v
i
=
[
R
2
t
2
]
P
w
=
1
∗
4
∗
4
∗
1
λ
i
=
[
R
3
t
3
]
P
w
=
1
∗
4
∗
4
∗
1
其
中
,
R
1
=
[
R
11
R
12
R
13
]
,
R
2
,
R
3
一
样
\lambda_{i} u_i= [R_{1} \ t_1]P_w=1*4 * 4*1 \\\lambda_{i} v_i= [R_{2} \ t_2]P_w=1*4 * 4*1 \\\lambda_{i} = [R_{3} \ t_3]P_w=1*4 * 4*1 \\ 其中,R_1=[R_{11} \ R_{12} \ R_{13}],R_2,R_3一样
λiui=[R1 t1]Pw=1∗4∗4∗1λivi=[R2 t2]Pw=1∗4∗4∗1λi=[R3 t3]Pw=1∗4∗4∗1其中,R1=[R11 R12 R13],R2,R3一样
这里一共有4个未知数,分别是
P
w
P_w
Pw的3个和一个
λ
i
\lambda_i
λi深度未知,将第三行带入到第一,二行,变成以下齐次方程的形式:
u
i
[
R
3
t
3
]
P
w
=
[
R
1
t
1
]
P
w
v
i
[
R
3
t
3
]
P
w
=
[
R
2
t
2
]
P
w
u_i[R_{3} \ t_3]P_w = [R_{1} \ t_1]P_w \\v_i[R_{3} \ t_3]P_w = [R_{2} \ t_2]P_w \\
ui[R3 t3]Pw=[R1 t1]Pwvi[R3 t3]Pw=[R2 t2]Pw
u i [ R 3 t 3 ] P w − [ R 1 t 1 ] P w = 0 v i [ R 3 t 3 ] P w − [ R 2 t 2 ] P w = 0 u_i[R_{3} \ t_3]P_w - [R_{1} \ t_1]P_w=0 \\v_i[R_{3} \ t_3]P_w - [R_{2} \ t_2]P_w=0 \\ ui[R3 t3]Pw−[R1 t1]Pw=0vi[R3 t3]Pw−[R2 t2]Pw=0
即:
(
u
i
[
R
3
t
3
]
−
[
R
1
t
1
]
)
1
∗
4
P
w
=
0
(
v
i
[
R
3
t
3
]
−
[
R
2
t
2
]
)
1
∗
4
P
w
=
0
(u_i[R_{3} \ t_3] - [R_{1} \ t_1])_{1*4}P_w=0 \\ (v_i[R_{3} \ t_3] - [R_{2} \ t_2])_{1*4}P_w=0 \\
(ui[R3 t3]−[R1 t1])1∗4Pw=0(vi[R3 t3]−[R2 t2])1∗4Pw=0
因此,可以将(7)中括号部分视作矩阵
D
2
∗
4
D_{2*4}
D2∗4,即:
D
i
P
w
=
0
D_iP_w=0
DiPw=0
注意D的维度是2×4,P是4×1,此时只是一组数据。所以当有n帧图像数据的时候,D的维度是2n×4.
接下来对D进行SVD分解
D
T
D
=
U
Σ
V
=
∑
i
=
1
4
σ
i
2
u
i
u
j
⊤
其
中
:
D
T
:
4
∗
2
n
,
D
:
2
n
∗
4.
U
:
4
∗
4
,
V
:
4
∗
4
,
Σ
:
4
∗
4
u
i
:
4
∗
1
,
u
j
:
1
∗
4.
D^{T}D=U\Sigma V \\ =\sum_{i=1}^{4} \sigma_{i}^{2} \mathbf{u}_{i} \mathbf{u}_{j}^{\top} \\ 其中:D^T:4*2n, \\ D:2n*4. \\ U:4*4, \\ V:4*4, \\ \Sigma:4*4 \\ u_i:4*1, \\ u_j:1*4. \\
DTD=UΣV=i=1∑4σi2uiuj⊤其中:DT:4∗2n,D:2n∗4.U:4∗4,V:4∗4,Σ:4∗4ui:4∗1,uj:1∗4.
结论:
Σ
\Sigma
Σ是奇异值处于对角线上的奇异值矩阵。其最小奇异值对应的v即是要求的解。
SVD的计算方法:https://byjiang.com/2017/11/18/SVD/
4 实际问题3:图像压缩&数据压缩
参考资料:https://www.zhihu.com/search?type=content&q=SVD
对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。
也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。
也就是说:
A
m
×
n
=
U
m
×
m
Σ
m
×
n
V
n
×
n
T
≈
U
m
×
k
Σ
k
×
k
V
k
×
n
T
A_{m \times n}=U_{m \times m} \Sigma_{m \times n} V_{n \times n}^{T} \approx U_{m \times k} \Sigma_{k \times k} V_{k \times n}^{T}
Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVk×nT
由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。
Mat image = imread("/home/alex/Pictures/earth.jpg", 0);
Mat temp(image.size(), CV_32FC1, Scalar(0));
image.convertTo(image, CV_32FC1);
Mat U, W, V;
SVD::compute(image, W, U, V,4);//opencv得到的V已经经过转置了
Mat w(image.rows, image.cols, CV_32FC1, Scalar(0));
int k = 90;
float radio = (float)(1920 * 1080) / (float)(k*(1920 + 1080 + 1));//1920k 1080k k 分别是 U的行数乘保留的列数 + k个特征值 +V的列数乘k行
for (int i = 0; i < k; i++)
w.ptr<float>(i)[i] = W.ptr<float>(i)[0];
cout << "U = " << U.cols << " U = " << U.rows << endl;
cout << "w = " << w.cols << " w = " << w.rows << endl;
cout << "V = " << V.cols << " V = " << V.rows << endl;
temp = U*w*V;
image.convertTo(image, CV_8UC1);
temp.convertTo(temp, CV_8UC1);
namedWindow("src",WINDOW_NORMAL);
namedWindow("res",WINDOW_NORMAL);
imshow("src",image);
imshow("res",temp);
waitKey(0);
cout << "k = " << k << ",\t" << "radio = " << radio << endl;
输出:
rows: 1920 cols:1080
U = 1920 U = 1920
w = 1080 w = 1920
V = 1080 V = 1080
k = 90, radio = 7.67744
对比如下:
原图:
处理后:
由此可以总结出:若一个像素为1字节, 原始图像需 m ∗ n m*n m∗n字节的存储空间, 而使用SVD分解后只需 k ∗ ( m + n + 1 ) k*(m+n+1) k∗(m+n+1)字节的存储空间, 以此达到压缩图像(矩阵)的目的.(k即是要保留的前k个最大的特征值)
水平有限,如有纰漏,请多指教