0 参考链接(尊重原著)
下面这个讲的很好很全面
视觉SLAM常见的QR分解SVD分解等矩阵分解方式求解满秩和亏秩最小二乘问题(最全的方法分析总结)
1 SVD分解原理
奇异值和特征值有相似的重要意义,都是为了提取出矩阵的主要特征。假设A是一个m∗n阶矩阵,如此则存在一个分解m阶正交矩阵U、非负对角阵Σ和n阶正交矩阵V使得 A = U Σ V T A=UΣV^T A=UΣVT
Σ对角线上的元素
Σ
i
,
i
Σ_{i,i}
Σi,i即为A的奇异值。而且一般来说,我们会将Σ上的值按从大到小的顺序排列。
SVD解决了特征值分解中只能针对方阵而没法对更一般矩阵进行分解的问题。所以在实际中,SVD的应用场景比特征值分解更为通用与广泛。将将上面的SVD分解用一个图形象表示如下。
这三个矩阵的规模,一点也不比原来矩阵的规模小好么。而且还要做两次矩阵的乘法。如果按照之前那种方式分解,肯定是没有任何好处的。关键是奇异值有个牛逼的性质:在大部分情况下,当我们把矩阵Σ里的奇异值按从大到小的顺序呢排列以后,很容易就会发现,奇异值σ减小的速度特别快。在很多时候,前10%甚至前1%的奇异值的和就占了全部奇异值和的99%以上。换句话说,大部分奇异值都很小,基本没什么用。既然这样,那我们就可以用前面r个奇异值来对这个矩阵做近似。于是,SVD也可以这么写:
A
m
×
n
≈
U
m
×
r
Σ
r
×
r
V
r
×
n
A_{m×n}≈U_{m×r}Σ_{r×r}V_{r×n}
Am×n≈Um×rΣr×rVr×n
其中,r≪m,r≪n。如果用另外一幅图描述这个过程,如下图:
如果r越大,跟原来的矩阵相似度就越高。如果r=n,那得到的就是原来的矩阵A。但是这样存储与计算的成本就越高。所以,实际在使用SVD的时候,需要我们根据不同的业务场景与需求还有资源情况,合理选择r的大小。本质而言,就是在计算精度与空间时间成本之间做个折中。
2 SVD分解意义
按照前面给出的几何含义,SVD 分解可以看成先旋转,然后进行分别缩放,然后再旋转的过程。
SVD分解解满秩(亏秩)最小二乘问题
SVD分解不仅可以解决满秩最小二乘问题,最重要的是可以解决亏秩最小二乘问题( r(A)< n 或 r < n的情况),而前面的方法在秩亏的时候都会失效。
设A的SVD分解为:
3 SVD分解的应用
- 降维
矩阵A的特征有n维,经过SVD分解之后,完全可以用前r个非零奇异值对应的奇异向量表示矩阵A的主要特征。这样,就起到了降维的作用。 - 压缩
经过SVD分解之后,表示原来的矩阵A,只需要存 U , Σ , V U,\Sigma ,V U,Σ,V三个较小的矩阵即可。而这三个小矩阵的规模加起来也远远小于原始矩阵A。这样,就达到压缩的作用。
4 SVD数学举例