计算截断的SVD,一次一个奇异值/向量


11

是否有一种截断的SVD算法可以一次计算一个奇异值?

我的问题:我想计算一个大的密集矩阵M的前ķ奇异值(和奇异矢量),但是我不知道k的合适值是多少。M很大,因此出于效率考虑,我宁愿不评估完整的SVD,而只是在之后截断最小的SV。中号ķ中号

理想情况下,将计算的奇异值的方式σ1个σ2顺序,从最大(σ1个)到最小(σñ)。这样一来,我可以简单地停止计算计算后ķ个奇异值,如果σķ/σ1个下降到低于某个阈值。

是否存在这样的算法(最好使用Python实现)?在谷歌搜索中,我只发现了以k为参数的截断SVD函数,因此迫使您先验猜测。


您的M是正方形还是矩形?如果是矩形,则需要长奇异矢量还是短奇异矢量?也就是说,如果M是m> n的(mxn),则要(mxk)还是(kxn)?
Max Hutchinson

M是矩形,行多于列。我想要短的奇异向量(即V,在M = U S V ^ T中)。
SuperElectric 2014年

Answers:


6

如果您需要近似k分解系数,则有几个选项可用。

  1. 排名显着的QR因式分解
  2. 插值分解(ID)和其他随机技术。

一个-中号ñŤ因子×σķ+1个一个:=ϵ

可以使用标准技术将上述形式的近似分解分解为标准分解,例如QR或SVD。Halko,Martinsson和Tropp在论文中提供了很好的评论“随机发现结构:构建近似矩阵分解的概率算法”

在软件方面,可以在scipy(scipy.linalg.interpolative)http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.html中找到ID算法的接口,该接口可让用户指定ϵ


2

(编辑,因为我一开始误解了这个问题;您已经知道有一些例程可以计算第一个 ķ奇异值。)

如果排除计算整个SVD的方法,则部分SVD算法将简化为使用迭代方法来解决相关的Hermitian特征值问题。因此,您可以采用的一种策略是自己手工编码这种事情,并使用移位和反转策略之类的方法来解决最大剩余的未解决的奇异值,直到您想停止为止。在诸如SLEPc之类的复杂程序包中,可能会有一些优雅的方法来执行此类操作

另一个策略如下:

  • s1个
  • τs1个Fτ0<F1个
  • 调用稀疏SVD例程。

ķ


如果您未在scipy.sparse.linalg.svds中指定“ k”,则无论“ tol”参数如何,它将默认为k = 6。目前尚不清楚这是一个错误,还是“ tol”是指计算出的奇异值(而不是其大小)的准确性
Nick Alger
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.