[透彻理解]由最小二乘到SVD分解

[透彻理解]由最小二乘到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]=223A×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=223a1×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=x1a1+x2a2),来代替向量 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=x1a1+x2a2=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(x1x2)+B(y1y2)+C(z1z2)=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](x1x2)(y1y2)(z1z2)=0
右边的矩阵表示平面上的任一点,且该式对平面上的任意两点都成立。

所以 n = ( A , B , C ) n=(A,B,C) n=(A,B,C)即是所在平面的法向量。

对靠近地面的的n个点,计算其协方差矩阵。对协方差矩阵进行SVD分解,可以得到对应的特征值和特征向量。其中,最小特征值对应的特征向量就是地面平面的法向量。

目的:拟合地面所在的方程Ax+By+Cz+d=0

  1. 取n个z值最小的点,认为其是地面点

取n个地面点,计算这n个点的协方差矩阵 C o v Cov Cov,然后对其做SVD分解,得到其在各个分量。最小奇异值所对应的向量便是地面的法向量 n n n.

由前面的证明可知: n = ( A , B , C ) n=(A,B,C) n=(ABC)

  1. 对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ˉ+D0Axˉ+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±δ0Axˉ+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 ... ynz1z2zn111n4abcd41=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=0Ax=0

D P w = 0 即 A x = 0 DP_w=0 \\ 即Ax=0 DPw=0Ax=0

下面以 A x = 0 Ax=0 Ax=0这种更普遍的表达形式进行推导。

A m ∗ n A_{m*n} Amn是一个超定方程的时候,此等式无解,因此需要取最小二乘的形式,即:
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 minAx22=min (xTATAxsbj.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]nn n n n维空间里的标准正交基。所以 x n ∗ 1 x_{n*1} xn1可以由此标准正交基构成,即:
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=0nkivi ,xRnsbj. 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      σmin2VT
将(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      σmin2v0T...vnTx=xT[v0 ... vn]σmax2v0T      σmin2vnTx=xTσmax2v0v0T      σmin2vnvnTx=xTσmax2      σmin2x=xTσmax2      σmin2x=[k0v0 ... knvn]σmax2      σmin2k0v0T...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} λiviui131=[[Rcw]33[tcw]31]34Pw=[[Rcw]33[tcw]31]34xwywzw141=R11R21R31R12R22R32R13R23R33t1t2t333xwywzw141
将其拆成行表示:
λ 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=1441λivi=[R2 t2]Pw=1441λi=[R3 t3]Pw=1441R1=[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])14Pw=0(vi[R3 t3][R2 t2])14Pw=0
因此,可以将(7)中括号部分视作矩阵 D 2 ∗ 4 D_{2*4} D24,即:
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=14σi2uiujDT:42n,D:2n4.U:44,V:44,Σ:44ui:41,uj:14.
结论: Σ \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×nTUm×kΣk×kVk×nT
preview

img

由于这个重要的性质,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 mn字节的存储空间, 而使用SVD分解后只需 k ∗ ( m + n + 1 ) k*(m+n+1) k(m+n+1)字节的存储空间, 以此达到压缩图像(矩阵)的目的.(k即是要保留的前k个最大的特征值)

水平有限,如有纰漏,请多指教

  • 13
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值