[透徹理解]由最小二乘到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)三個點,現在需要對這個三個點擬合一條直線。

設這條直線的方程爲y=ax+by=ax+b 。我們希望這條直線可以同時通過這三個點,也就是這條直線的參數要滿足:
{1×k+b=20×k+b=22×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.
這是一個超定方程。爲了後面表示方便,在這裏我們用x1,x2x_1,x_2來代替k,bk,b
{1×x1+x2=20×x1+x2=22×x1+x2=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    10   12   1][x1x2]=[223]                                                     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}
這即是我們要優化的非齊次線性方程組Ax=bAx=b

爲了方便我們接下來的理解,現在將其拆分成下面這種形式:
[102]×x1+[111]×x2=[223]                                                                                          a1        ×    x1  +    a2×x2  =       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}
這裏的理解方式是,兩個3維向量,經過x1x_1x2x_2的線性組合之後,得到bb向量。

這裏更高級一點的說法是,在以a1,a2a_1,a_2爲基向量(3維)所張成的2維子空間上,尋找最接近bb向量的向量。

a1,a2a_1,a_2視作基向量,畫圖理解。
在這裏插入圖片描述
由這個圖可知,公式(4)肯定是不成立的,因爲向量bb(紅色)就不在基向量a1,a2a_1,a_2所張成的二維平面(二維子空間)裏。

所以,我們在這裏退而求其次,在該二維子空間中找一個向量bb'(由基向量組成b=x1a1+x2a2b'=x_1*a_1+x_2*a_2),來代替向量bb,但是這個向量距離bb'到向量bb的距離最短(如下圖所示)

在這裏插入圖片描述
如圖所示,OE=b,OD=bOE=b',OD=b,顯而易見,bb'bb向此二維平面的正交投影,此時bb'bb之間的距離最近,距離差值維DEDE的長度。

而此時b=x1a1+x2a2=x1OC+x2OBb'=x_1*a_1+x_2*a_2=x_1OC+x_2OBx1,x2x_1,x_2就是我們需要求出的值。

更進一步的理解。當有n組數據帶入時,A矩陣的維度將會是n×2.那麼這裏整個最小二乘擬合問題就可以理解成:a1,a2a_1,a_2是n維線性空間中的兩個線性無關的向量,在span{a1,a2a_1,a_2}所張成的子空間中(2維)找到bb在其中的正交投影bb',二者之間的距離即是最小二乘優化的最小值min。bb'在基a1,a2a_1,a_2上的投影,即是要求解的變量值,

如果需要擬合的變量不止2個,假設有m個,那麼整個問題就可以理解成是n維向量到m維超平面的正交投影求解。

回到公式(3)中來,對其的求解,有以下方法。
Ax=bATAx=ATbx=(ATA)1ATb Ax=b \\ A^{T} A x=A^{T}b \\ x=(A^{T} A)^{-1}A^{T}b
按照道理來說,此時我們已經解決問題了。但是衆所周知,對於高維度的矩陣,計算機進行求逆操作是非常慢的,問題就出在實際應用中,點雲地面的擬合,可能是幾千上萬個點,這樣就會導致A矩陣的維度很高,顯然直接求逆操作在此時是不可行的。所以,如何快速求解Ax=bAx=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).

證明:假設(x1,y1,z1),(x2,y2,z2)(x_1,y_1,z_1),(x_2,y_2,z_2)是當前平面上的兩個點。

則有:Ax1+By1+Cz1+D=0Ax_1+By_1+Cz_1+D=0,Ax2+By2+Cz2+D=0Ax_2+By_2+Cz_2+D=0,所以兩式相減,可得:

A(x1x2)+B(y1y2)+C(z1z2)=0A(x_1-x_2)+B(y_1-y_2)+C(z_1-z_2)=0,即
[ABC][(x1x2)(y1y2)(z1z2)]=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
右邊的矩陣表示平面上的任一點,且該式對平面上的任意兩點都成立。

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

對靠近地面的的n個點,計算其協方差矩陣。對協方差矩陣進行SVD分解,可以得到對應的特徵值和特徵向量。其中,最小特徵值對應的特徵向量就是地面平面的法向量。

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

  1. 取n個z值最小的點,認爲其是地面點

取n個地面點,計算這n個點的協方差矩陣CovCov,然後對其做SVD分解,得到其在各個分量。最小奇異值所對應的向量便是地面的法向量nn.

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

  1. 對n個靠近地面的點遍歷加和,計算一個均值Xˉ=(xˉ,yˉ,zˉ)\bar X=(\bar x,\bar y,\bar z)。認爲此均值帶入地面所在方程
    Axˉ+Byˉ+Czˉ+D0Axˉ+Byˉ+CzˉD A\bar x+B\bar y+C\bar z+D≈0 \\ 即:A\bar x+B\bar y+C\bar z≈-D

此時D-D的值已知。

此時,均值Xˉ\bar X因爲是n個點的均值,默認是最靠近地面所在平面的點。其他所有的n個點,都可以認爲更偏離所擬合的平面。即:
Axˉ+Byˉ+Czˉ+D±δ0Axˉ+Byˉ+Czˉ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
因此,在對\velodyne_points中所有的topic進行篩選地面點的過程中,所有的點Xi=(xi,yi,zi)X_i=(x_i,y_i,z_i)帶入式(3)所得到的值符合以下約束:
Axi+Byi+Czi[Dδ,D+δ] Ax_i+By_i+Cz_i \in [-D - \delta,-D+\delta]
此時,δ\delta的值需要自己設定,代表了對地面點的篩選條件。

2.2 解法2 SVD 求解Ax=0

此方法類似於二維平面的直線擬合。

假設我們有nn個(n>>4n>>4)靠近地面的點,現假設地面平面所在的方程爲ax+by+cz+d=0ax+by+cz+d=0。利用這nn個點對該平面方程的參數進行擬合。原理與二維平面的直線擬合類似,這裏不做過多推導。

帶入nn個點的座標,可得:
{ax1+by1+cz1+d=0ax2+by2+cz2+d=0ax3+by3+cz3+d=0...axn+byn+czn+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.
即可化爲以下Ax=0Ax=0的齊次方程組形式(超定方程)。
[x1y1z11x2y2z21  ... xnynzn1]n4[abcd]41=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
對矩陣AA進行SVD即可得最後的結果。

問題:這種方法存在[a b c d][a \ b \ c \ d]的尺度問題。因爲是齊次方程,其值可以任意縮放,帶來的問題就是實際應用篩選地面點的過程中,不同的縮放係數會導致篩選閾值不確定性。這裏建議根據實際分割效果做多次實驗決定。

2.3 證明:SVD=最小二乘

DPw=0Ax=0 DP_w=0 \\ 即Ax=0

DPw=0Ax=0 DP_w=0 \\ 即Ax=0

下面以Ax=0Ax=0這種更普遍的表達形式進行推導。

AmnA_{m*n}是一個超定方程的時候,此等式無解,因此需要取最小二乘的形式,即:
minAx22=min (xTATAxsbj.x=1 min ||Ax||_2^2 \\ =min \ (x^{T}A^{T}Ax)\\ sbj.||x||=1
已知:
ATA=VΛVTA=UΣVT,AT=VΣTUTUTU=VTV=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 \\
可得,V=[v0 v1 ... vn]nnV=[v_0 \ v_1 \ ... \ v_n]_{n*n}nn維空間裏的標準正交基。所以xn1x_{n*1}可以由此標準正交基構成,即:
x=k0v0+k1v1+...+knvn=i=0nkivi ,xRnsbj. 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
由公式(12)可知:
ATA=VΣTUTUΣVT=VΣTΣVT=V[σmax2      σmin2]VT 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 \\
將(13)(14)帶入到(11)中,
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=σmin2min=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}

上述情況中,kn=1,ki(in)=0\mathrm{k}_{n}=1, \quad \mathrm{k}_{\mathrm{i}}(i \neq n)=0
此時,対應x=knvn=vnx=k_nv_n=v_n

3 實際問題2:三角化

假設世界中的某點PwP_w(世界座標未知)被連續n幀相機數據觀測到,像素座標分別是(u1,v1),...,(un,vn)(u_1,v_1),...,(u_n,v_n).n幀對應的相機座標Twc1,...,TwcnT_{wc1},...,T_{wcn},皆已知。根據三角化,我們可以構建最小二乘表達式,綜合nn幀觀測數據,獲得點PwP_w的位置。

預備推導:

PciPci:PwP_w在第ii幀相機座標系TwciT_{wci}下的座標。

Pci=TcwiPwP_{ci}=T_{cwi}P_{w}

Pw=TwciPci     =aaP_{w}=T_{wci}P_{ci} \\ \ \ \ \ \ =aa

Pci=(xci,yci,zci)=zci(xcizci,ycizci,1)=λi(ui,vi,1)=λipiP_{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

其中,λi\lambda_i是深度值,pip_i是像素座標

Pw=TwciPciPw=TwciλipiTciwPw=λipi P_{w}=T_{wci}P_{ci} \\ P_{w}=T_{wci}\lambda_ip_i \\T_{ciw}P_w=\lambda_ip_i \\

展開成矩陣的形式:
λi[viui1]31=[[Rcw]33[tcw]31]34Pw=[[Rcw]33[tcw]31]34[xwywzw1]41=[R11R12R13t1R21R22R23t2R31R32R33t3]33[xwywzw1]41 \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}
將其拆成行表示:
λiui=[R1 t1]Pw=1441λivi=[R2 t2]Pw=1441λi=[R3 t3]Pw=1441R1=[R11 R12 R13],R2,R3 \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一樣
這裏一共有4個未知數,分別是PwP_w的3個和一個λi\lambda_i深度未知,將第三行帶入到第一,二行,變成以下齊次方程的形式:
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 \\v_i[R_{3} \ t_3]P_w = [R_{2} \ t_2]P_w \\

ui[R3 t3]Pw[R1 t1]Pw=0vi[R3 t3]Pw[R2 t2]Pw=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][R1 t1])14Pw=0(vi[R3 t3][R2 t2])14Pw=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 \\
因此,可以將(7)中括號部分視作矩陣D24D_{2*4},即:
DiPw=0 D_iP_w=0

注意D的維度是2×4,P是4×1,此時只是一組數據。所以當有n幀圖像數據的時候,D的維度是2n×4.

接下來對D進行SVD分解
DTD=UΣV=i=14σi2uiujDT:42n,D:2n4.U:44,V:44,Σ:44ui:41,uj:14. 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. \\
結論:Σ\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個的奇異值和對應的左右奇異向量來近似描述矩陣。

也就是說:
Am×n=Um×mΣm×nVn×nTUm×kΣk×kVk×nT 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}
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字節, 原始圖像需mnm*n字節的存儲空間, 而使用SVD分解後只需k(m+n+1)k*(m+n+1)字節的存儲空間, 以此達到壓縮圖像(矩陣)的目的.(k即是要保留的前k個最大的特徵值)

水平有限,如有紕漏,請多指教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章