[透徹理解]由最小二乘到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 = a x + 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 = 2 0 × k + b = 2 2 × k + b = 3
這是一個超定方程。爲了後面表示方便,在這裏我們用x 1 , x 2 x_1,x_2 x 1 , x 2 來代替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 × x 1 + x 2 = 2 0 × x 1 + x 2 = 2 2 × x 1 + x 2 = 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}
⎣ ⎡ 1 1 0 1 2 1 ⎦ ⎤ [ x 1 x 2 ] = ⎣ ⎡ 2 2 3 ⎦ ⎤ ↑ ↑ ↑ A × x = b
這即是我們要優化的非齊次線性方程組 A x = b Ax=b A x = 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}
⎣ ⎡ 1 0 2 ⎦ ⎤ × x 1 + ⎣ ⎡ 1 1 1 ⎦ ⎤ × x 2 = ⎣ ⎡ 2 2 3 ⎦ ⎤ ↑ ↑ ↑ a 1 × x 1 + a 2 × x 2 = b
這裏的理解方式是,兩個3維向量,經過x 1 x_1 x 1 和x 2 x_2 x 2 的線性組合之後,得到b b b 向量。
這裏更高級一點的說法是,在以a 1 , a 2 a_1,a_2 a 1 , a 2 爲基向量(3維)所張成的2維子空間上,尋找最接近b b b 向量的向量。
把a 1 , a 2 a_1,a_2 a 1 , a 2 視作基向量,畫圖理解。
由這個圖可知,公式(4)肯定是不成立的,因爲向量b b b (紅色)就不在基向量a 1 , a 2 a_1,a_2 a 1 , a 2 所張成的二維平面(二維子空間)裏。
所以,我們在這裏退而求其次,在該二維子空間中找一個向量b ′ b' b ′ (由基向量組成b ′ = x 1 ∗ a 1 + x 2 ∗ a 2 b'=x_1*a_1+x_2*a_2 b ′ = x 1 ∗ a 1 + x 2 ∗ a 2 ),來代替向量b b b ,但是這個向量距離b ′ b' b ′ 到向量b b b 的距離最短(如下圖所示)
如圖所示,O E = b ′ , O D = b OE=b',OD=b O E = b ′ , O D = b ,顯而易見,b ′ b' b ′ 是b b b 向此二維平面的正交投影 ,此時b ′ b' b ′ 和b b b 之間的距離最近,距離差值維D E DE D E 的長度。
而此時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 ′ = x 1 ∗ a 1 + x 2 ∗ a 2 = x 1 O C + x 2 O B ,x 1 , x 2 x_1,x_2 x 1 , x 2 就是我們需要求出的值。
更進一步的理解。當有n組數據帶入時,A矩陣的維度將會是n×2.那麼這裏整個最小二乘擬合問題 就可以理解成:a 1 , a 2 a_1,a_2 a 1 , a 2 是n維線性空間中的兩個線性無關的向量,在span{a 1 , a 2 a_1,a_2 a 1 , a 2 }所張成的子空間中(2維)找到b b b 在其中的正交投影b ′ b' b ′ ,二者之間的距離即是最小二乘優化的最小值min。b ′ b' b ′ 在基a 1 , a 2 a_1,a_2 a 1 , a 2 上的投影,即是要求解的變量值,
如果需要擬合的變量不止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
A x = b A T A x = A T b x = ( A T A ) − 1 A T b
按照道理來說,此時我們已經解決問題了。但是衆所周知,對於高維度的矩陣,計算機進行求逆操作是非常慢的 ,問題就出在實際應用中,點雲地面的擬合,可能是幾千上萬個點,這樣就會導致A矩陣的維度很高,顯然直接求逆操作在此時是不可行的。所以,如何快速求解A x = b Ax=b A x = 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) ( x 1 , y 1 , z 1 ) , ( x 2 , y 2 , z 2 ) 是當前平面上的兩個點。
則有:A x 1 + B y 1 + C z 1 + D = 0 Ax_1+By_1+Cz_1+D=0 A x 1 + B y 1 + C z 1 + D = 0 ,A x 2 + B y 2 + C z 2 + D = 0 Ax_2+By_2+Cz_2+D=0 A x 2 + B y 2 + C z 2 + 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 ( x 1 − x 2 ) + B ( y 1 − y 2 ) + C ( z 1 − z 2 ) = 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
[ A B C ] ⎣ ⎡ ( x 1 − x 2 ) ( y 1 − y 2 ) ( z 1 − z 2 ) ⎦ ⎤ = 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 C o v ,然後對其做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
A x ˉ + B y ˉ + C z ˉ + D ≈ 0 即 : A x ˉ + B y ˉ + C z ˉ ≈ − 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
A x ˉ + B y ˉ + C z ˉ + D ± δ ≈ 0 即 : A x ˉ + B y ˉ + C z ˉ ≈ − D ± δ
因此,在對\velodyne_points
中所有的topic進行篩選地面點的過程中,所有的點X i = ( x i , y i , z i ) X_i=(x_i,y_i,z_i) X i = ( x i , y i , z i ) 帶入式(3)所得到的值符合以下約束:
A x i + B y i + C z i ∈ [ − D − δ , − D + δ ]
Ax_i+By_i+Cz_i \in [-D - \delta,-D+\delta]
A x i + B y i + C z i ∈ [ − 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 a x + b y + c z + 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.
⎩ ⎪ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎪ ⎧ 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
即可化爲以下A x = 0 Ax=0 A x = 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
⎣ ⎢ ⎢ ⎡ x 1 x 2 x n y 1 y 2 . . . y n z 1 z 2 z n 1 1 1 ⎦ ⎥ ⎥ ⎤ n ∗ 4 ⎣ ⎢ ⎢ ⎡ a b c d ⎦ ⎥ ⎥ ⎤ 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
D P w = 0 即 A x = 0
D P w = 0 即 A x = 0
DP_w=0 \\
即Ax=0
D P w = 0 即 A x = 0
下面以A x = 0 Ax=0 A x = 0 這種更普遍的表達形式進行推導。
當A m ∗ n A_{m*n} A m ∗ 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
m i n ∣ ∣ A x ∣ ∣ 2 2 = m i n ( x T A T A x ) s b j . ∣ ∣ 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 \\
A T A = V Λ V T A = U Σ V T , A T = V Σ T U T U T U = V T V = I
可得,V = [ v 0 v 1 . . . v n ] n ∗ n V=[v_0 \ v_1 \ ... \ v_n]_{n*n} V = [ v 0 v 1 . . . v n ] n ∗ n 是n n n 維空間裏的標準正交基。所以x n ∗ 1 x_{n*1} x n ∗ 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 = 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
由公式(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 \\
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
將(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}
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
上述情況中,k n = 1 , k i ( i ≠ n ) = 0 \mathrm{k}_{n}=1, \quad \mathrm{k}_{\mathrm{i}}(i \neq n)=0 k n = 1 , k i ( i = n ) = 0
此時,対應x = k n v n = v n x=k_nv_n=v_n x = k n v n = v n
3 實際問題2:三角化
假設世界中的某點P w P_w P w (世界座標未知)被連續n幀相機數據觀測到,像素座標分別是( u 1 , v 1 ) , . . . , ( u n , v n ) (u_1,v_1),...,(u_n,v_n) ( u 1 , v 1 ) , . . . , ( u n , v n ) .n幀對應的相機座標T w c 1 , . . . , T w c n T_{wc1},...,T_{wcn} T w c 1 , . . . , T w c n ,皆已知。根據三角化 ,我們可以構建最小二乘表達式,綜合n n n 幀觀測數據,獲得點P w P_w P w 的位置。
預備推導:
P c i Pci P c i :P w P_w P w 在第i i i 幀相機座標系T w c i T_{wci} T w c i 下的座標。
P c i = T c w i P w P_{ci}=T_{cwi}P_{w} P c i = T c w i P w
P w = T w c i P c i = a a P_{w}=T_{wci}P_{ci} \\ \ \ \ \ \ =aa P w = T w c i P c i = a a
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 P c i = ( x c i , y c i , z c i ) = z c i ( z c i x c i , z c i y c i , 1 ) = λ i ( u i , v i , 1 ) = λ i p i
其中,λ i \lambda_i λ i 是深度值,p i p_i p i 是像素座標
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 \\
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
展開成矩陣的形式:
λ 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 ⎣ ⎡ 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 1 1 R 2 1 R 3 1 R 1 2 R 2 2 R 3 2 R 1 3 R 2 3 R 3 3 t 1 t 2 t 3 ⎦ ⎤ 3 ∗ 3 ⎣ ⎢ ⎢ ⎡ x w y w z w 1 ⎦ ⎥ ⎥ ⎤ 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一樣
λ 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 1 1 R 1 2 R 1 3 ] , R 2 , R 3 一 樣
這裏一共有4個未知數,分別是P w P_w P w 的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 \\
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 = 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 \\
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 ] − [ 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 \\
( 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)中括號部分視作矩陣D 2 ∗ 4 D_{2*4} D 2 ∗ 4 ,即:
D i P w = 0
D_iP_w=0
D i P w = 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. \\
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 .
結論: Σ \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}
A m × n = U m × m Σ m × n V n × n T ≈ U m × k Σ k × k V k × n T
由於這個重要的性質,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個最大的特徵值)
水平有限,如有紕漏,請多指教