科研需要拜读了有关lanczos bidiagonalization的三篇论文,也是上篇博客最后里提到的三篇,下面试第一篇。
Lanczos bidiagonalization with partial reorthogonalization (Rasmus Munk Larsen 1998)
读本文之前,首先要知道lanczos有两种算法,一种针对大型稀疏对称矩阵的三对角算法,一种是针对大型稀疏非对称矩阵的二对角算法。
lanczos bidiagonalization(LBD)最早是由Golub 和Kahan提出的,并且它的分块扩展成为了许多方法的计算核心部分,已经被证实是求大型稀疏矩阵或者结构化矩阵的奇异值分解的有效方法。
Berry认为,PRO方法是计算大型稀疏矩阵最大奇异值以及奇异值向量的最有效方法。在SVDPACk, LANSO包里的子程序lanso是用于显示计算对称矩阵
ATA
,
的特征值,然后再形成矩阵A的奇异值。然而,当A是ill-conditioned矩阵时, 会导致计算的奇异值的精确度降低。虽然采用C的形式,能够避免,但是同时会使从正交化的计算和存储空间显著增加,因为lanczos向量长度是m+n。同样计算同样数量的奇异值需要的迭代次数会加倍。
本文提出的BPRO算法,即是Matlab包里的PROPACK.
从上文可知有两种对称化的方法,可以通过求 对称矩阵的特征值和特征向量,求得A的奇异值和向量。这是Golub 和Kahan提出的最早期的算法,在LAPACK中的SVD就是通过对对称矩阵
ATA
用隐式的QR算法求特征值实现的。
但事实是 ATA 形成对于算法的数值稳定性十分重要,除非矩阵A里是非常小的条件数,那么对称矩阵会导致舍入误差,从而我们不能保证从 ATA 的特征值得到的最小奇异值的准确性。
因为针对大型稀疏矩阵Golub 和Kahan算法的不切合实际性,lanczos算法由早期针对对称矩阵三对角化,然后对三对角矩阵进行对称QR算法(LAPACK _STEQR),QR算法是用于计算三对角矩阵特征向量最快的算法。lanczos二对角化之后,用二对角svd子程序(LAPACK _BDSQR).
BPRO已经实现,可以根据需要,下载并添加到matlab中,而matlab里自带的ARPACK里的eigs函数,是根据the implicitly restarted lanczos算法,svds函数是调用了eigs函数计算得到的。
BPRO还有其他基于lanczos bidiagonalization算法适合于计算大概规模稀疏或者结构性矩阵的计算。