快速计算truncated svd的算法有哪些?
宽泛地讲,有两种方法计算特征值分解和奇异值分解:一种是对角化矩阵,并且产生所有特征值或者奇异值;另一种是用迭代的算法产生部分特征值或者奇异值。
有两种对称化矩阵的方法例如:
因此,truncate svd,可以转化为特征值分解问题。
求特征值特征向量方法中,最简单迭代算法是幂法。
1. Initialize random x.
2. Update x←Ax.
3. Normalize x←x/∥x∥.
4. Goto step #2 unless converged.
所有更复杂的算法都是基于幂法迭代的思想。比如,针对稀疏非对称矩阵的Arnoldiiteration 方法,针对稀疏对称矩阵的 Lanczos iteration 方法,还有其他变种方法。
下列几本参考书中都有介绍:(其中第一本很经典)
- Golub & Van Loan, Matrix Computations
- Trefethen & Bau, Numerical Linear Algebra
- Demmel, Applied Numerical Linear Algebra
- Saad, Numerical Methods for Large Eigenvalue Problems
几乎所有的数理统计包(Matlab,R, Python numpy 里面的库)都是用的同样的Fortran库来实现特征值或者奇异值分解,这些库就是 LAPACK和 ARPACK. ,其中ARPACK.主要是Arnoldi/Lanczositerations实现 。例如在matlab中的函数:eig, eigs, svd, svds. svd是利用lapack实现了全分解,svds利用ARPACK实现部分分解,但实际上是eigs.对称化矩阵的封装而已。
还有一个Fortran库是PROPACK,它包括一系列计算大的稀疏矩阵奇异值分解方法,svd子程序是基于部分重正交化的lanczos双对角算法实现的。具体内容可以参考一下几篇论文,
1. Lanczos bidiagonalizationwith partial reorthogonalization (Rasmus Larsen 1998)
2. Augmentedimplicitly restarted Lanczos bidiagonalization methods ( Baglama& Reichel, 2005)
3. Finding structure with randomness:Probabilistic algorithms for constructing approximate matrix decompositions.(Halko et al. 2009)