史上最简SLAM零基础解读(3) - 白话来说SVD奇异值分解(1)→原理推导与奇异值求解举例

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始
有兴趣的朋友可以加微信 17575010159 相互讨论技术 - 文末公众号也可关注

 

一、前言

这篇博客,主要使用最通俗的语言来讲解SVD奇异值分解,通过该篇博客,将知道 SVD 的来龙去脉,底层原理。同时知道如何利用他去做图片压缩,PCA,求解矩阵(如 Fundamental 矩阵,Homography 矩阵)等。我会详细的讲解 SVD 的每一个细节。由浅到深,由窄到广。那么我们现在就开始吧。

 

二、简单原理介绍

在推导数学公式,以及几何意义之前,我们先来看看其物理层面的应用。这样有助于后面更深层次的理解。首先这里有个基本的概念简单说一下, 一个 m × n m \times n m×n 维的矩阵,我们可以分解成 m × k m \times k m×k 以及 k × n k \times n k×n 的矩阵相乘,如下图所示:
在这里插入图片描述
到了这一步还不够,我们还要继续分解,根据上面的原理,我们是不是可以对矩阵 X m × k X_{m\times k} Xm×k 做同样的分解,把他分解成两个矩阵。那么我们现在来做个假设(后面有推导该公式的细节以及计算过程):
A m × n = U m × m Σ m × n V n × n T (1) \tag{1} \color{blue} A_{m\times n}=U_{m\times m}\Sigma_{m\times n}V^T_{n \times n} Am×n=Um×mΣm×nVn×nT(1)其下标 m × m , m × m , n × n {m\times m}, m\times m,n \times n m×m,m×m,n×n 分别表示对应形状。大家可能比较奇怪了,把一个矩阵分解成这个样子,有什么作用。如果矩阵 A m × m A_{m \times m} Am×m 使用其上三个矩阵来表示,似乎并没有节省空间。这个先不着急,继续往下分析,如果公式(1)中的具备如下特征:
在这里插入图片描述
对于 m m m n n n 列的矩阵 A A A, 通过SVD分解之后,拆分成了3个子矩阵,其中 U U U 矩阵为 m m m m m m 列的方阵, V V V n n n n n n 列的方阵, Σ \Sigma Σ为只有对角线有值的矩阵,其中的值称之为奇异值。看一个例子,原始矩阵如下: A 4 × 5 = [ 1 0 0 0 2 0 0 3 0 0 0 0 0 0 0 0 4 0 0 0 ] (2) \tag{2} \color{blue} A_{4\times 5}=\left[\begin{array}{lllll} 1 & 0 & 0 & 0 & 2 \\ 0 & 0 & 3 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 4 & 0 & 0 & 0 \end{array}\right] A4×5= 10000004030000002000 (2)奇异值分解的结果如下 U 4 × 4 = [ 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 ] , Σ 4 × 5 = [ 4 0 0 0 0 0 3 0 0 0 0 0 5 0 0 0 0 0 0 0 ] , V 5 × 5 T = [ 0 1 0 0 0 0 0 1 0 0 0.2 0 0 0 0.8 0 0 0 1 0 0.8 0 0 0 − 0.2 ] (3) \tag{3} \color{blue} U_{4\times 4}=\left[\begin{array}{llll} 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 1 & 0 & 0 & 0 \end{array}\right], \Sigma_{4\times 5}=\left[\begin{array}{ccccc} 4 & 0 & 0 & 0 & 0 \\ 0 & 3 & 0 & 0 & 0 \\ 0 & 0 & \sqrt{5} & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \end{array}\right], V^{T}_{5\times 5}=\left[\begin{array}{ccccc} 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ \sqrt{0.2} & 0 & 0 & 0 & \sqrt{0.8} \\ 0 & 0 & 0 & 1 & 0 \\ \sqrt{0.8} & 0 & 0 & 0 & -\sqrt{0.2} \end{array}\right] U4×4= 0001010010000010 ,Σ4×5= 40000300005 000000000 ,V5×5T= 000.2 00.8 100000100000010000.8 00.2 (3)
在奇异值分解中, Σ \Sigma Σ 矩阵的奇异值是按照从大到小的顺序排列的,而且减少的特别快,经常前 10% 的奇异值就占据了全部奇异值 99% 以上的比例。基于这个性质,我们可以只提取前几个奇异值及其对应的矩阵来近似的描述原来的矩阵。

那么我们现在就来做个实验,我们只获取矩阵得如下部分来复原矩阵 A A A:
在这里插入图片描述

也就是
U 4 × 3 = [ 0 0 1 0 1 0 0 0 0 1 0 0 ] , Σ 3 × 3 = [ 4 0 0 0 3 0 0 0 5 ] , V 3 × 5 T = [ 0 1 0 0 0 0 0 1 0 0 0.2 0 0 0 0.8 ] (4) \tag{4} \color{blue} U_{4\times 3}=\left[\begin{array}{llll} 0 & 0 & 1\\ 0 & 1 & 0\\ 0 & 0 & 0 \\ 1 & 0 & 0 \end{array}\right], \Sigma_{3\times 3}=\left[\begin{array}{ccccc} 4 & 0 & 0\\ 0 & 3 & 0 \\ 0 & 0 & \sqrt{5}\\ \end{array}\right], V^{T}_{3\times 5}=\left[\begin{array}{ccccc} 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ \sqrt{0.2} & 0 & 0 & 0 & \sqrt{0.8} \\ \end{array}\right] U4×3= 000101001000 ,Σ3×3= 400030005 ,V3×5T= 000.2 100010000000.8 (4)这样就是然后我们求得 A 4 × 5 = U 4 × 3 Σ 3 × 3 V 3 × 5 T A_{4\times 5}=U_{4\times 3}\Sigma_{3\times 3} V^{T}_{3\times 5} A4×5=U4×3Σ3×3V3×5T,其结果如下:
A 4 × 5 = [ 1 0 0 0 2 0 0 3 0 0 0 0 0 0 0 0 4 0 0 0 ] (5) \tag{5} \color{blue} A_{4\times 5}=\left[\begin{array}{lllll} 1 & 0 & 0 & 0 & 2 \\ 0 & 0 & 3 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 4 & 0 & 0 & 0 \end{array}\right] A4×5= 10000004030000002000 (5)可以看到其与(2)式中的 A 4 × 5 A_{4\times 5} A4×5 结果是完全一致的,完成了完美的复原。为什么这里能完成完美的复原呢? 因为 Σ \Sigma Σ 矩阵的奇异值表示其对应的 特征 ( 后面有详细讲解 ) \color{blue} {特征}(后面有详细讲解) 特征(后面有详细讲解) 重要性,其因为 Σ 3 × 3 \Sigma_{3\times 3} Σ3×3 已经包含了 Σ 4 × 5 \Sigma_{4\times 5} Σ4×5 的所有非零元素,所以其是可以完美复原出来的。现在我们来看看,其他的不同矩阵取值,如下图所示:

也就是
U 4 × 2 = [ 0 0 0 1 0 0 1 0 ] , Σ 3 × 3 = [ 4 0 0 3 ] , V 3 × 5 T = [ 0 1 0 0 0 0 0 1 0 0 ] (6) \tag{6} \color{blue} U_{4\times 2}=\left[\begin{array}{llll} 0 & 0 \\ 0 & 1 \\ 0 & 0 \\ 1 & 0 \end{array}\right], \Sigma_{3\times 3}=\left[\begin{array}{ccccc} 4 & 0\\\\ \\ 0 & 3 \\ \end{array}\right], V^{T}_{3\times 5}=\left[\begin{array}{ccccc} 0 & 1 & 0 & 0 & 0 \\ \\ 0 & 0 & 1 & 0 & 0 \\ \end{array}\right] U4×2= 00010100 ,Σ3×3= 4003 ,V3×5T= 0010010000 (6)这样就是然后我们求得 A 4 × 5 = U 4 × 2 Σ 3 × 3 V 2 × 5 T A_{4\times 5}=U_{4\times 2}\Sigma_{3\times 3} V^{T}_{2\times 5} A4×5=U4×2Σ3×3V2×5T,其结果如下: A 4 × 5 = [ 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 4 0 0 0 ] (7) \tag{7} \color{blue} A_{4\times 5}=\left[\begin{array}{lllll} 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 3 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 4 & 0 & 0 & 0 \end{array}\right] A4×5= 00000004030000000000 (7)这个时候我们与前面 (2) 式 A 4 × 5 A_{4 \times 5} A4×5 相比,可以发现其第1行的第4列与第4列的两个1,已经不见了。也就是说明其复原过程中出现了信息丢失。上面的两个实验可以总结如下图所示:
在这里插入图片描述
上图主要表示了如下公式( k k k n n n越接近说明图像还原度越高,当然压缩效果也没有那么明显): A m × n = U m × m Σ m × n V n × n T ≈ U m × k Σ k × k V k × n T (8) \tag{8} \color{blue} 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(8)

 

三、图像压缩

那么我们如何使用 SVD 来做图像压缩呢? 通过上面的介绍,我们就可以完成图像压缩了。这里我们把一张图像的像素看作前面的矩阵 A m × n A_{m \times n} Am×n,然后编写代码如下:

import cv2
import numpy as np
# 调整该值重复运行代码保存图像
k = 200
img = cv2.imdecode(np.fromfile('./1.png', dtype=np.uint8), 0)
u, w, v = np.linalg.svd(img)
u = u[:, :k]
w = np.diag(w)
w = w[:k, :k]
v = v[:k, :]
img = u.dot(w).dot(v)
cv2.imencode('.jpg', img)[1].tofile('k={}.jpg'.format(k))

调整代码中的 k k k 值,重复保存图像。注意,根据前面的介绍我们可以得知 0 < k < h 0<k<h 0<k<h, k值越大,图像的还原度越高。原图如下:
请添加图片描述

本人调整 k = 100 k=100 k=100, k = 50 k=50 k=50, k = 20 k=20 k=20值保存结果如下:

我们输入一张图像,通过SVD奇异值分解分解之后,得到 u, w, v 三个矩阵,根据自己的需求,对这三个矩阵进行适当的剪切,代码中的剪切大小通过变量 k k k 控制。我们只需要保存剪切之后的矩阵,就可以复原图像了。注意这里的 w 为对角矩阵,只需要保存对角线的元素即可。

那么我们来计算一下,这张图像压缩多少空间。因为上图中我们可以看到 k = 100 k=100 k=100 的时候,图像基本是没有太大损失的。所以我们按 k = 100 k=100 k=100 来计算。原始图像像素为200x200=40000。压缩之后为 200x100+100+100x100=20000+100+10000=30100。可以看到其压缩了1/4左右的大小,并且基本没有像素损失。

 

四、特征值分解→EVD

两个矩阵 A A A B B B 相乘, 其为 A A A 的行与 B B B 的列,对应相乘相加,所以出现如下公式: A m × n = U m × m Σ m × n V n × n T (1) \tag{1} \color{blue} A_{m\times n}=U_{m\times m}\Sigma_{m\times n}V^T_{n \times n} Am×n=Um×mΣm×nVn×nT(1)通过前面介绍我们知道 Σ \Sigma Σ 为只有对角线有值的矩阵,其中的值称之为奇异值。奇异值表示其对应 特征 \color{blue} {特征} 特征 的重要性。在对齐讲解之前,我们需要回顾一下特征值与特征向量,首先其定义如下:
A x ⃗ = λ x ⃗ (9) \tag{9} \color{blue} A \vec x=\lambda \vec x Ax =λx (9) 其中 A A A m × m m \times m m×m的方阵 方阵 \color{blue} 方阵 方阵(该前置条件), x ⃗ \vec x x 是一个 m m m 维的列向量,满足上诉公式,则我们说 λ λ λ 是矩阵 A A A 的一个特征值,而 x ⃗ \vec x x 是矩阵 A A A 的特征值在 λ λ λ 所对应的特征向量。为什么可以写成这个样子,主要是因为:

	1、矩阵乘法对应了一个变换,是把任意一个向量变成另一个方向或长度都大多不同的新向量。
	
	2、如果矩阵对某一个向量或某些向量只发生伸缩变换,不对这些向量产生旋转的效果,
	那么这些向量就称为这个矩阵的特征向量,伸缩的比例就是特征值。

如果想稍微了解具体一点的,可以参考一下这篇博客:特征值与特征向量的意义。一个矩阵有多个相互对应的 x ⃗ \vec x x λ λ λ 。那么我们写成一个通用式子: A x i ⃗ = λ i x ⃗ (10) \tag{10} \color{blue} A\vec{x_i}=\lambda_i \vec{x} Axi =λix (10)一个 m m m 阶的方阵,那么则有: A x 1 ⃗ = λ 1 x 1 ⃗ A x 2 ⃗ = λ 2 x 2 ⃗ ⋯ A x ⃗ m = λ m x ⃗ m (11) \tag{11} \color{blue}\begin{aligned} A \vec{x_{1}} &=\lambda_{1} \vec{x_{1}} \\ A \vec{x_{2}} &=\lambda_{2} \vec{x_{2}} \\ & \cdots \\ A \vec{x}_{m} &=\lambda_{m} \vec{x}_{m} \end{aligned} Ax1 Ax2 Ax m=λ1x1 =λ2x2 =λmx m(11)这里我们令: U m × m = [ x 1 ⃗    x 2 ⃗    x 3 ⃗ ⋯    x m ⃗ ] \color{blue} U_{m\times m}=[\vec{x_1} ~~ \vec{x_2} ~~\vec{x_3}\cdots ~~\vec{x_m} ] Um×m=[x1   x2   x3   xm ] Λ = [ λ 1 ⋯ 0 ⋮ ⋱ ⋮ 0 ⋯ λ m ] \color{blue} {\Lambda}=\left[\begin{array}{ccc} \lambda_{1} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & \lambda_{m} \end{array}\right] Λ= λ100λm 则我们可以得到 A U = U Λ (12) \tag{12} \color{blue} {A} {U}={U} {\Lambda} AU=UΛ(12)进一步推导(由于这里的特征向量两两正交,所以U为正交阵,正交阵的逆矩阵等于其转置-有兴趣的同学可以百度一下正交矩阵): A = U Λ U − 1 = U Λ U T (13) \tag{13} \color{blue} A=U \Lambda U^{-1}=U \Lambda U^{T} A=UΛU1=UΛUT(13)到这里为止,对于方阵的特征分解可以说是完成了。但是这里出现了一个问题,上面的结论是基于 方阵 \color{blue} 方阵 方阵推导出来的,那么如果 A A A 并非一个方阵,而是一个任意的矩阵呢? 比如前面提到的 A m × n A_{m\times n} Am×n 或者张长方形的图像。那么就无法 EVD 特征分解了。这个时候就轮到 SVD 奇异值分解登场了。

五、特征值分解→SVD

通过前面的介绍,我们知道知道一个方阵是可以进行 EVD 特征分解的,经过推导得到公式(13)
A m × m = U Λ U − 1 = U Λ U T (13) \tag{13} \color{blue} A_{m\times m}=U \Lambda U^{-1}=U \Lambda U^{T} Am×m=UΛU1=UΛUT(13)那么一个矩形的矩阵如 A m × n A_{m\times n} Am×n我们如何进行分解呢? 首先我们可以把 A m × n A_{m\times n} Am×n 转换成 m × m m\times m m×m 的或者 n × n n\times n n×n 矩阵,那么我们就可以使用 EVD 进行分解了,比如 A A T AA^T AAT A T A A^TA ATA 分别会得到 m × m m\times m m×m n × n n\times n n×n 的矩阵。我们回顾一下 SVD 奇异值分解公式: A m × n = U m × m Σ m × n V n × n T (1) \tag{1} \color{blue} A_{m\times n}=U_{m\times m}\Sigma_{m\times n}V^T_{n \times n} Am×n=Um×mΣm×nVn×nT(1)
注意 [ \color{red}注意[ 注意[ 其中 U U U 是一个 m × m m×m m×m 的矩阵, Σ Σ Σ 是一个 m × n m×n m×n 的矩阵,除了主对角线上的元素以外全为 0,主对角线上的每个元素都称为奇异值, V V V 是一个 n × n n×n n×n 的矩阵。 U U U V V V 都是酉矩阵(有兴趣的朋友可以百度一下),即满足 U T U = E U^TU=E UTU=E V T V = E V^TV=E VTV=E,这里的 E E E 表示单位矩阵,即对角线为1,其余都是0的矩阵 ] \color{red}] ]

如果我们将 A A A 的转置和 A A A 做矩阵乘法,那么会得到 n × n n×n n×n 的一个方阵 A T A A^TA ATA。既然 A T A A^TA ATA 是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式: ( A T A ) v ⃗ i = λ i v ⃗ i \color{blue} \left(A^{T} A\right) \vec v_{i}=\lambda_{i} \vec v_{i} (ATA)v i=λiv i

这样我们就可以得到矩阵 A T A A^TA ATA n n n 个特征值和对应的 n n n 个特征向量 v ⃗ \vec v v 。将 A T A A^TA ATA 的所有特征向量张成一个n×n的矩阵 V V V,就是我们SVD公式里面的 V V V 矩阵了。一般我们将 V V V 中的每个特征向量叫做A的右奇异向量。

如果我们将 A A A A A A 的转置做矩阵乘法,那么会得到 m × m m×m m×m 的一个方阵 A A T AA^T AAT 既然是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式: ( A A T ) u ⃗ i = λ i u ⃗ i \color{blue} \left(AA^{T} \right) \vec u_{i}=\lambda_{i} \vec u_{i} (AAT)u i=λiu i这样我们就可以得到矩阵 A A T AA^T AAT 的m个特征值和对应的m个特征向量 u ⃗ \vec u u 了。将 A A T AA^T AAT 的所有特征向量张成一个 m × m m×m m×m 的矩阵 U U U,就是我们SVD公式里面的 U U U 矩阵了。一般我们将 U U U 中的每个特征向量叫做 A A A 的左奇异向量。

U U U V V V 我们都求出来了,现在就剩下奇异值矩阵 Σ Σ Σ 没有求出了。由于 Σ Σ Σ 除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值 σ σ σ 就可以了(后面有举例如何求解)。我们注意到: A = U Σ V T ⇒ A V = U Σ V T V ⇒ A V = U Σ ⇒ A v i = σ i u i ⇒ σ i = A v i / u i \color{blue} A=U \Sigma V^{T} \Rightarrow A V=U \Sigma V^{T} V \Rightarrow A V=U \Sigma \Rightarrow A v_{i}=\sigma_{i} u_{i} \Rightarrow \sigma_{i}=A v_{i} / u_{i} A=UΣVTAV=UΣVTVAV=UΣAvi=σiuiσi=Avi/ui其上的 σ i \sigma_{i} σi 就是每个特征对应的奇异值,那么进而求出出奇异值矩阵 Σ Σ Σ

上面还有一个问题没有讲,就是我们说 A T A A^TA ATA 的特征向量组成SVD中的 V V V 矩阵,而 A A T AA^T AAT 的特征向量组成SVD中的 U U U 矩阵,这有什么根据吗?这个其实很容易证明,我们以V矩阵的证明为例(用到: U T U = I , Σ T Σ = Σ 2 U^{T} U=I, \Sigma^{T} \Sigma=\Sigma^{2} UTU=I,ΣTΣ=Σ2)。 A = U Σ V T ⇒ A T = V Σ T U T ⇒ A T A = V Σ T U T U Σ V T = V Σ 2 V T (14) \tag{14}\color{blue} A=U \Sigma V^{T} \Rightarrow A^{T}=V \Sigma^{T} U^{T} \Rightarrow A^{T} A=V \Sigma^{T} U^{T} U \Sigma V^{T}=V \Sigma^{2} V^{T} A=UΣVTAT=VΣTUTATA=VΣTUTUΣVT=VΣ2VT(14)可以看出(根据公式13) A T A A^TA ATA 特征向量组成 SVD 中的 V V V 矩阵。类似的方法可以得到 A A T AA^T AAT 的特征向量组成 SVD 中的 U U U 矩阵。进一步我们还可以看出特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系: σ i = λ \color{blue} \sigma_{i} = \sqrt{\lambda} σi=λ 这样也就是说,我们可以不用 σ i = A v i / u i \sigma_{i}=A v_{i} / u_{i} σi=Avi/ui来计算奇异值,也可以通过求出 A T A A^TA ATA的特征值取平方根来求奇异值。如果大家看到这里来,比较蒙圈了,我们就来看一个例子吧。

 

七、SVD 计算举例

这里我们用一个简单的例子来说明矩阵是如何进行奇异值分解的。我们的矩阵A定义为: A = [ 1 1 1 1 1 0 ] \color{blue} A=\left[\begin{array}{ccc} 1 &1\\ 1 &1\\ 1 &0 \end{array}\right] A= 111110 我们首先求出 A T A A^TA ATA A A T AA^T AAT:
A T A = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 1 ] = [ 2 1 1 2 ] (14) \tag{14} \color{blue} A^TA=\left[\begin{array}{ccc} 0 &1&1\\ \\ 1 &1&0\\ \end{array}\right]\left[\begin{array}{ccc} 0 &1\\ 1 &1\\ 1 &1\\ \end{array}\right]=\left[\begin{array}{ccc} 2 &1\\ \\ 1 &2\\ \end{array}\right] ATA= 011110 011111 = 2112 (14) A A T = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 0 ] = [ 1 1 0 1 2 1 0 1 1 ] (15) \tag{15} \color{blue} AA^T=\left[\begin{array}{ccc} 0 &1\\ 1 &1\\ 1 &0\\ \end{array}\right]\left[\begin{array}{ccc} 0 &1&1\\ \\ 1 &1&0\\ \end{array}\right]=\left[\begin{array}{ccc} 1 &1 &0\\ 1 &2&1\\ 0 &1&1\\ \end{array}\right] AAT= 011110 011110 = 110121011 (15)然后我们还需要求得 A T A A^TA ATA 的特征向量值与特征向量, 先来回顾一下矩阵特征值和特征向量的计算过程: A A A 为 m 阶矩阵,若数 λ λ λ m m m 维非 0 列向量 x ⃗ \vec x x 满足 A x ⃗ = λ x ⃗ A\vec x=λ\vec x Ax =λx ,那么数 λ λ λ 称为 A A A 的特征值, x ⃗ \vec x x 称为 A A A 的对应于特征值λ的特征向量。式 A x ⃗ = λ x ⃗ A\vec x=λ\vec x Ax =λx 也可写成 ( A − λ E ) x ⃗ = 0 (A-λE)\vec x=0 (AλE)x =0,并且 ∣ λ E − A ∣ |λE-A| λEA 叫做A 的特征多项式。当特征多项式等于0的时候,称为 A A A 的特征方程,特征方程是一个齐次线性方程组,求解特征值的过程其实就是求解特征方程的解。推导细节如下(其中的 E E E 为单位矩阵,即对角线为1,其余都为0的矩阵): A x ⃗ = λ x ⃗    ⇒    A x ⃗ = λ E x ⃗    ⇒    ( λ E − A ) x ⃗ = 0 \color{blue} A\vec x=\lambda \vec x ~~\Rightarrow~~ A\vec x=\lambda E\vec x ~~\Rightarrow~~ (\lambda E-A)\vec x=0 Ax =λx     Ax =λEx     (λEA)x =0 ∣ λ E − A ∣ = [ λ − a 11 − a 12 ⋯ − a 1 n − a 21 λ − a 22 ⋯ − a 2 n ⋯ ⋯ ⋯ ⋯ − a m 1 − a m 2 ⋯ λ − a m n ] = 0 \color{blue} |\lambda E-A|=\left[\begin{array}{ccc} \lambda-a_{11} & -a_{12} & \cdots & -a_{1n} \\ -a_{21} & \lambda-a_{22} & \cdots & -a_{2n} \\ \cdots & \cdots & \cdots & \cdots\\ -a_{m1} & -a_{m2} & \cdots & \lambda-a_{mn} \\ \end{array}\right]=0 λEA= λa11a21am1a12λa22am2a1na2nλamn =0也就是 ∣ λ E − A ∣ |\lambda E-A| λEA 对应的行列式为0即可。根据上述公式我们可以求解出出 A A T AA^T AAT的特征值与特征:

λ 1 = 3 , v 1 = [ 1 / 6 2 / 6 1 / 6 ] ;         λ 2 = 1 , v 2 = [ 1 / 2 0 − 1 / 2 ] ;         λ 3 = 0 , v 3 = [ 1 / 3 − 1 3 1 / 3 ] ; \color{blue} \lambda_1=3, v_1=\left[\begin{array}{ccc} 1/\sqrt{6}\\ 2/\sqrt{6}\\ 1/\sqrt{6}\\ \end{array}\right]; ~~~~~~~\lambda_2=1, v_2=\left[\begin{array}{ccc} 1/\sqrt{2}\\ 0\\ -1/\sqrt{2}\\ \end{array}\right];~~~~~~~\lambda_3=0, v_3=\left[\begin{array}{ccc} 1/\sqrt{3}\\ -1\sqrt{3}\\ 1/\sqrt{3}\\ \end{array}\right]; λ1=3,v1= 1/6 2/6 1/6 ;       λ2=1,v2= 1/2 01/2 ;       λ3=0,v3= 1/3 13 1/3 ;利用 σ i = A v i / u i \sigma_{i}=A v_{i} / u_{i} σi=Avi/ui 其中 i = 1 , 2 i=1,2 i=1,2 求奇异值的: A = U Σ V T = ( 1 / 6 1 / 2 1 / 3 2 / 6 0 − 1 / 3 1 / 6 − 1 / 2 1 / 3 ) ( 3 0 0 1 0 0 ) ( 1 / 2 1 / 2 − 1 / 2 1 / 2 ) \color{blue} A=U \Sigma V^{T}=\left(\begin{array}{ccc} 1 / \sqrt{6} & 1 / \sqrt{2} & 1 / \sqrt{3} \\ 2 / \sqrt{6} & 0 & -1 / \sqrt{3} \\ 1 / \sqrt{6} & -1 / \sqrt{2} & 1 / \sqrt{3} \end{array}\right)\left(\begin{array}{cc} \sqrt{3} & 0 \\ 0 & 1 \\ 0 & 0 \end{array}\right)\left(\begin{array}{cc} 1 / \sqrt{2} & 1 / \sqrt{2} \\ -1 / \sqrt{2} & 1 / \sqrt{2} \end{array}\right) A=UΣVT= 1/6 2/6 1/6 1/2 01/2 1/3 1/3 1/3 3 00010 (1/2 1/2 1/2 1/2 )

 

六、结语

通过该篇博客,我们知道了如何对一个矩阵进行 SVD 奇异值分解,并且列举了一个图像压缩的例子。但是这仅仅其中的一部分应用,我们还可以用来求解超定方程 A x = 0 Ax = 0 Ax=0(最优解)。 当然,该博客的篇幅已经很长了,所以令起一篇博客继续为大家介绍如何求解超定方程,为什么最小奇异值对应的特征值,为超定方程的解。

 
 
 
在这里插入图片描述

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
ORB-SLAM2是一种基于二维图像的实时单目视觉SLAM系统,可以在没有先验地图的情况下,从单个摄像头的输入实时定位和建立环境模型。为了更好地理解ORB-SLAM2的原理和代码实现,我们需要逐行分析其核心算法。 ORB-SLAM2的主要原理是通过特征提取,特征匹配和位姿估计来实现定位和建图。在代码,我们可以看到一些关键的数据结构和函数调用,这些都是实现这些原理的关键。 首先,ORB-SLAM2使用FAST特征检测器在图像检测关键点。这些关键点代表图像的有趣区域。然后,使用ORB描述符对关键点进行描述。ORB描述符使用二进制位串来表示关键点周围的特征。 然后,ORB-SLAM2使用词袋法(Bag-of-Words)模型来进行特征匹配。它首先通过建立一个词典来表示所有关键点的描述符。然后,使用词袋模型来计算图像之间的相似度,从而找到匹配的关键点。 接下来,ORB-SLAM2使用RANSAC算法来估计两个图像之间的相对位姿。RANSAC算法通过迭代随机采样的方式来筛选出最佳的匹配关系,从而得到相对位姿估计。 最后,ORB-SLAM2使用优化算法(如g2o)来进行位姿图优化,从而更精确地估计相机的位姿。通过优化,ORB-SLAM2能够减少位置漂移,并在动态环境下更好地跟踪相机的位置。 总的来说,ORB-SLAM2通过特征提取、特征匹配和位姿估计实现实时单目视觉SLAM。核心代码实现了特征检测、描述符提取、特征匹配、RANSAC算法和图优化等关键步骤。了解这些原理和代码实现,可以帮助我们更好地理解ORB-SLAM2系统背后的工作原理
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南才尽,年少无知!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值