# 30分钟学会SVD奇异值分解 SVD(Singular Value Decomposition)奇异值分解分解是机器学习中最重要的矩阵分解方法。 它能够将一个任意形状的矩阵$A$分解成一个正交矩阵$U$和一个对角矩阵$\Sigma$以及另一个正交矩阵$V^T$的乘积。 SVD分解具有非常深刻的几何含义。矩阵实际上对应着一种线性变换,一个矩阵作用到一个向量上,会得到一个新的向量。任何一个矩阵$A$的操作效果可以分解成一次旋转$V^T$,一次拉伸和维度改变$\Sigma $,以及另外一次旋转$U$三者作用效果的合成。 SVD分解通常用于数据压缩和数据降维。用于数据降维时,既可以对列降维,也可以对行降维,其中对列的降维等价于PCA的降维。 不仅如此,SVD算法还可以用于在声音和图像处理中剥离背景信号,在推荐算法中也经常出现它的身影。 ### 一,SVD矩阵分解简介 SVD分解将任意矩阵$A$分解成一个正交矩阵$U$和一个对角矩阵$\Sigma$以及另一个正交矩阵$V^T$的乘积。 对角矩阵$\Sigma$的对角元称为矩阵$A$的奇异值,可以证明,奇异值总是大于等于0的。 当对角矩阵$\Sigma$的奇异值按从大到小排列时,SVD分解是唯一的。 $$A = U \Sigma V^T$$ 假定$A$是$m\times n$维的,则 $U$ 是$m\times m$维的,$\Sigma$是 $m\times n$维的,$V^T$是 $n\times n$ 维的。 SVD分解有着非常深刻的几何含义。 矩阵实际上是对应着一种线性变换。一个矩阵作用到一个向量上,会得到一个新的向量。任何一个矩阵$A$的操作效果可以分解成一次旋转$V^T$,一次拉伸和维度改变$\Sigma $,以及另外一次旋转$U$三者作用效果的合成。 注意正交矩阵$V^T$和$U$作用到向量后是不会改变向量长度的,所以对应着旋转变换。 ![](./data/SVD公式.png) ```python ``` ### 二,SVD分解的数学推演 $A = U \Sigma V^T$ 可以推出 $A A^T = (U \Sigma V^T)(V \Sigma^T U^T) = U(\Sigma\Sigma^T)U^T $ $U^TA A^TU = \Sigma\Sigma^T$ $\Sigma\Sigma^T$ 依然是对角矩阵,又U为正交矩阵。 所以 $(\Sigma\Sigma^T)$为$A A^T$的相似对角矩阵,其对角元为 $A A^T$的特征值,U由其对应特征向量构成,这些向量称为A的左奇异向量。 因此$\Sigma$的对角元为$A A^T$特征值的平方根,称之为矩阵A的奇异值。 类似地$V$由$A^TA$的特征向量构成,这些向量称为A的右奇异向量。 ```python ``` ### 三,SVD分解和数据压缩 奇异值描述了矩阵对应的拉伸变换在各个方向的比例,是矩阵的重要特征。 奇异值的分布通常非常不均,在很多的情况下前10%甚至1%的奇异值之和就占了全部奇异值之和的99%以上。 因此我们可以用前$r$个大的奇异值来近似的描述矩阵。$(r<