在实践中如何计算矩阵的SVD


11

例如,MATLAB如何计算给定矩阵的SVD?我认为答案可能涉及计算的特征向量和特征值A*A'。如果是这样,我还想知道它是如何计算出来的?



4
其实,不,它并没有涉及计算的特征值和值!这将大大降低结果的准确性。一种一种Ť
迈克尔·格兰特

Answers:


11

一种一种Ť

看到

GH Golub和C. Reinsch。奇异值分解和最小二乘解。Numerische Mathematik 14:403-420,1970年。

在许多关于线性数值代数的教科书中都讨论了这种材料。


13

除了(现在是经典的)Golub-Reinsch论文, Brian在回答中指出(我已经链接到该手册的手册版本),以及(现在也是经典的)Golub-Kahan的前作论文,但还有很多自那时以来,在计算SVD方面的重要发展。首先,我必须总结一下常用方法的工作原理。

计算矩阵的SVD的想法在质量上类似于用于计算对称矩阵的本征分解的方法(并且,如OP中所述,它们之间存在密切的关系)。特别地,一个过程分为两个阶段:转换为双对角矩阵,然后找到双对角矩阵的SVD。这完全类似于首先将对称矩阵还原为三对角线形式,然后计算所得三对角线的特征分解的过程。

为了计算对角矩阵的SVD,Jim Demmel和Velvel Kahan论文是一个特别有趣的突破,该论文证明了通过适当地修改最初提出的方法,即使是微小的奇异值也可以计算出对角矩阵的奇异值。 Golub-Reinsch。这是再其次是(重?)发现DQD算法,这是Rutishauser老商差分算法的后裔。(Beresford Parlett 在这里进行了很好的讨论。)如果有内存,这是LAPACK内部使用的首选方法。除此之外,在对称特征问题的解决方案中,总是有可能导出开发的SVD版本。例如,存在分而治之的SVD版本以及旧式Jacobi算法的SVD版本(在某些情况下可能更准确)。

关于双角化,Barlow的论文概述了一种改进的方法,该方法比Golub和Reincsh的原始过程需要更多的工作,但产生的双角矩阵更准确。


1
@Jack,你见过这样的机会吗?
JM

令人惊讶的是,我没有!
杰克·普尔森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.