SVD(奇异值分解)的原理与应用
1. 前言
前段时间做三维模型参数化的过程中接触到了SVD(singular value decomposition),翻译成中文就是奇异值分解。它的作用简单来说,就是提取一个较复杂矩阵中的关键部分,然后用一个简单的矩阵表示其关键部分,以达到简化的目的。基于这个原因,它的应用范围也十分广泛,比如:LSA(隐性语义分析)、推荐系统、特征压缩(或称数据降维)、PCA(主成分分析)、模型参数化等。
2. SVD原理
特征值分解和奇异值分解两者有着很紧密的关系,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈谈特征值分解吧:
A 特征值:
如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式:
这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式:
其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。在这里要明确一点,一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。
比如说下面的一个矩阵:
M乘以向量(x,y):
也就是拉伸向量的x轴,示意图如下:
B 奇异值
特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,但在实际应用过程中方阵并没有普遍性,奇异值分解可以用来干这个事情,奇异值分解是一个能适用于任意的矩阵的一种分解的方法:
奇异值跟特征值类似,在矩阵Σ中也是从大到小排列,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前 r 个的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:
右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵:U、Σ、V就好了。通常我们只保留前三个或前几个奇异值就可以近似表示矩阵A了。
3. SVD的应用
A 三维模型参数化过程中会涉及到SVD的内容(ARAP算法中应用到),参数化效果示意图如下图:
参数化至
B 用SVD解PCA的问题,示意图如下:
其实SVD在还有很多实际应用(如数据压缩等),我暂时还没接触过,就先写这么多吧。