什么是SVD(奇异值分解)?

34

它实际上是如何减少噪音的?你能推荐一些不错的教程吗?


如果你想了解理论知识,那么请去维基百科 - 他们有基本的描述和参考资料。如果你需要关于特定编程主题的帮助,请重新阐述问题(例如如何使用Lapack获取共轭矩阵的SVD等)。 - Anonymous
20
请不要关闭。这比一些在这个网站上的感性问题更与编程有关。 - Jason S
经过一些思考,我不得不同意,并移除 -1 :) - Anonymous
5个回答

50

SVD可以从几何角度理解为对向量的变换,适用于方阵。

考虑一个n x n的方阵M将一个向量v乘以产生输出向量w:

w = M*v

奇异值分解M是三个矩阵的乘积M=U*S*V,因此w=U*S*V*v。U和V是正交矩阵。从几何变换的角度来看(通过乘以向量来作用),它们是旋转和反射的组合,不改变它们正在乘以的向量的长度。S是一个对角线矩阵,表示沿着每个n个轴具有不同缩放因子(对角线项)的缩放或挤压。

因此,左乘矩阵M的向量v的效果是先将v旋转/反射为M的正交因子V,然后通过对角线因子S缩放/挤压结果,最后再通过M的正交因子U旋转/反射结果。

从数值的角度来看,SVD之所以可取,是因为由正交矩阵乘法得到的结果是可逆且非常稳定的操作(条件数为1)。SVD捕捉对角缩放矩阵S中任何不良条件。


有人只是点了-1:能解释一下为什么吗? - Jason S

18

使用奇异值分解(SVD)减少噪声的一种方法是进行分解,将接近零的分量设为零,然后重新组合。

这里有一个关于SVD的在线教程

你可能想看一下Numerical Recipes


2
这也是LSA/LSI(潜在语义索引)的基础。理论上,“小值”向量实际上只是向量的“嘈杂”扰动。 - Gregg Lind

8
奇异值分解是一种将nxm矩阵M“分解”为三个矩阵的方法,使得M=USV。S是一个对角方阵(唯一非零元素在从左上到右下的对角线上),包含M的“奇异值”。U和V是正交的,这导致了SVD的几何理解,但这并不是降噪所必需的。
使用M=USV,我们仍然保留了原始矩阵M及其所有噪声。然而,如果我们只保留k个最大的奇异值(这很容易,因为许多SVD算法计算了一个分解,其中S的条目按非递增顺序排序),那么我们就可以得到原始矩阵的近似值。这是有效的,因为我们假设小值是噪声,并且数据中更重要的模式将通过与较大奇异值相关联的向量来表达。
实际上,得到的近似值是原始矩阵最精确的秩-k近似值(具有最小平方误差)。

6
回答标题问题:SVD是对非方阵进行特征值/特征向量的一般化处理。例如,$X \in N \times p$,则X的SVD分解得到$X=UDV^T$,其中D是对角线矩阵,U和V是正交矩阵。现在$X^TX$是一个方阵,且$X^TX$的SVD分解为$VD^2V$,其中V等价于$X^TX$的特征向量,$D^2$包含$X^TX$的特征值。

4
SVD也可用于将任意模型(以公式表示)全局拟合到数据上(关于两个变量且表达为矩阵)。例如,数据矩阵A = D * MT,其中D表示系统的可能状态,M表示其相对某个变量(例如时间)的演化。通过SVD,A(x,y) = U(x) * S * VT(y),因此D * MT = U * S * VT,然后D = U * S * VT * MT+,其中“+”表示伪逆。然后可以将演化的数学模型与V的列拟合,每个列都是模型组成部分的线性组合(这很容易,因为每个列都是1D曲线)。这获得了生成M?(?表示基于拟合)的模型参数。M * M?+ * V = V?,这允许最小化残差R * S^2 = V - V?,从而确定D和M。U和V的列还可以检查以获取有关数据的信息;例如,V的每个拐点通常表示模型的不同组成部分。最后,实际回答您的问题,重要的是要注意,尽管每个连续奇异值(对角矩阵S的元素)及其随附的向量U和V具有较低的信噪比,但在这些“不太重要”的向量中,模型的组成部分的分离实际上更为显著。换句话说,如果数据由按指数和等方式变化的状态变化组成,则每个指数的相对权重在较小的奇异值中越来越接近。换句话说,后面的奇异值具有向量更不平滑(更嘈杂),但其中每个组件所表示的变化更为明显。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接