Pytorch和Tensorflow在相同数据规模规模下的降维SVD(Singular Value Decompositionm)算法中的运算速度对比
上一篇文章讲了如何在Pytorch和Tensorflow中使用PCA降维算法,这篇文章就来讲一下降维的另一种算法SVD算法。
那么既然有PCA那我们为什么要用SVD呢?
对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的几个的奇异值和对应的左右奇异向量来近似描述矩阵。正是由于这个性质,SVD可以用于PCA降维,来做数据压缩和去噪。
PCA和SVD的区别
- SVD可以获取另一个方向上的主成分,而PCA只能获得单个方向上的主成分。
- 第二,PCA在计算机中运算量很大,而SVD更加容易得到结果。
- 通过SVD可以得到PCA相同的结果,但是SVD通常比直接使用PCA更稳定。因为PCA需要计算 X T X X^TX XTX 的值,对于某些矩阵,求协方差时很可能会丢失一些精度。
SVD算法的基本原理
我们在上一篇文章中了解到特征值与特征向量,其中 A = P B P T A=PBP^T A=PBPT,P为A的特征向量组成的矩阵。那么我们可以假设A也可以被分解为 A = U ∑ V T A=U \sum V^T A=U∑VT,其中矩阵A是一个m×n的矩阵,U是一个m×m的矩阵,Σ是一个m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n×n的矩阵. U T U = E , V T V = E U^TU=E,V^TV=E UTU=E,VTV=E(也有的书将E写为I)。
U U U被称为左奇异矩阵, V V V被称为右奇异矩阵。
那么我们如何求要的U和V呢?
假设 A = U ∑ V T A=U \sum V^T A=U∑VT那么 A A T = U ∑ V T V ∑ U T =