存在哪些快速算法来计算截断的SVD?


14

可能不在这里,但存在几种(一种)相关的问题。

在文献中闲逛(或在Google中搜索“截断的SVD算法”)会发现很多使用以各种方式截短的,并声称(令人沮丧的是,通常没有引证)有快速的算法可以对其进行计算,但是没有人似乎在指出这些算法是什么。

我唯一能找到的是一个随机算法redSVD库中使用。

我想看到的是一组精确且不精确的算法,适合理解系统的工作原理(但不一定要实际实现它们!)。

有人对这种事情有很好的参考吗?


如果我想很好地存储数据,我可以在哈希(想想ram)中使用b树(或rb树)。如果我有一个用于数据的b树,那么我可以在O(log(n))个时间采样分位数中进行此类操作。我敢打赌,对于大数据,此类采样可用于在短时间内计算出与svd矩阵相当的稀疏近似。您可能还会查找“压缩感知”,这是一种非常统计的极端数据压缩方法。
EngrStudent-恢复莫妮卡2015年

截断的SVD是指您只对查找几个领先的奇异矢量/值感兴趣,而不是对所有它们感兴趣?
变形虫说恢复莫妮卡

@amoeba是的,就是这个想法。
John Doucette

Answers:


16

从广义上讲,有两种方法来计算特征值或奇异值分解。一种方法是对角线化矩阵,这实际上会同时产生整个特征值/奇异值分解(整个特征值谱),请参见此处的概述:计算奇异值分解(SVD)的有效算法是什么?另一种选择是使用一种迭代算法,该算法一次生成一个(或几个)特征向量。在计算出所需数量的特征向量之后,可以停止迭代。

我认为没有专门针对SVD的迭代算法。这是因为,可以计算a的SVD 矩阵通过执行一个正方形对称的特征分解Ñ + × Ñ + 矩阵 = 0 0因此,您应该问的不是问什么算法可以计算出截断的SVD,而是要问什么迭代算法可以计算出特征分解的:截断SVD的算法迭代求特征分解的算法n×mB(n+m)×(n+m)

A=(0BB0).
algorithm for truncated SVDiterative algorithm for eigendecomposition.

最简单的迭代算法称为 幂迭代,实际上非常简单:

  1. x
  2. xAx
  3. xx/x
  4. 除非收敛,否则转到步骤2。

所有更复杂的算法最终都基于功率迭代思想,但确实变得相当复杂。必要的数学由Krylov子空间给出。这些算法是Arnoldi迭代(用于平方非对称矩阵),Lanczos迭代(用于平方对称矩阵)及其变体,例如“隐式重启Lanczos方法”等。

您可以在以下教科书中找到相关说明:

  1. Golub&Van Loan,矩阵计算
  2. Trefethen&Bau,数值线性代数
  3. Demmel,应用数值线性代数
  4. Saad,大特征值问题的数值方法

所有合理的编程语言和统计信息包(Matlab,R,Python numpy,您都可以使用它)都使用相同的Fortran库来执行特征/奇异值分解。这些是LAPACKARPACK。ARPACK代表ARnoldi PACKage,全都与Arnoldi / Lanczos迭代有关。例如,在Matlab中,SVD有两个功能:svd通过LAPACK执行完全分解,并svds通过ARPACK计算给定数量的奇异矢量,并且它实际上只是eigs对“平方化”矩阵的调用的包装。

更新资料

BAABA

这些方法也有一个Fortran库,称为PROPACK

软件包PROPACK包含一组函数,用于计算大型和稀疏或结构化矩阵的奇异值分解。SVD例程基于具有部分正交化(BPRO)的Lanczos双角化算法。

但是,PROPACK似乎不如ARPACK标准,并且标准编程语言本身不支持。它由拉斯穆斯·拉森(Rasmus Larsen)撰写,他有1998年的长达90页的大型论文Lanczos双角化和部分正交化,并且看起来很不错。感谢@MichaelGrant通过此计算科学SE线程

在最近的论文中,最受欢迎的似乎是Baglama&Reichel,2005, Augmented隐式重启Lanczos的对角化方法,这可能是最新技术。感谢@Dougal在评论中提供了此链接。

更新2

实际上,您自己引用的概述文件中确实有一种完全不同的方法:Halko等。2009,寻找具有随机性的结构:用于构造近似矩阵分解的概率算法。我对评论还不够了解。


请注意,确实存在特定于SVD的迭代方法。例如,增强隐式重启Lanczos双双角化方法,J。Baglama和L. Reichel,SIAM J. Sci。计算 2005年。(我还没有读过这篇论文,以了解它与您提供的特征值方法是否根本不同,只是知道人们喜欢这种方法。)
Dougal

1
感谢您的链接,@ Dougal。我应该说我对这些方法都不是很了解,因此不能对此发表评论。如果有更多知识的人士能够解释各种迭代方法之间的关系,那就太好了。据我了解,香草Lanczos方法是用于计算方阵的特征值,而不是用于SVD。“增强的隐式重启Lanczos”应该与此密切相关,但是您是对的-似乎与SVD直接相关。不确定如何将它们组合在一起。如果我仔细观察,将更新我的答案。
变形虫说恢复莫妮卡

1
@Dougal,我做了一些粗略的阅读,并进行了更新。
变形虫说恢复莫妮卡

@amoeba在规则化最小二乘的情况下将“截断SVD” 与“原理成分回归”基本相同吗?
GeoMatt22 2016年

1
@amoeba您能评论一下Facebook的随机SVD实现吗?有人似乎说这是目前最快的解决方案之一。如果您可以编辑以对此发表评论,那就太好了。
蒂姆

4

我只是通过谷歌搜索快速的SVD偶然发现了线程,所以我想自己弄清楚这些事情,但是也许您应该研究自适应交叉逼近(ACA)。

MM=i=0kUiViTN×NO(N))。所以它真的很快;不幸的是许多人用“快”掉以轻心。

同样,这是否有效取决于您的问题。在我个人遇到的许多情况下,ACA是一个非常有用的数值工具。

注意:我想将此内容写为评论,但是因为我刚刚创建了此帐户,所以我没有足够的声誉来发表评论...但是发布是可行的。


2

这是我过去成功使用的一种技术(在Netflix数据集上)用于计算截短的SVD。它取自本文。在协作过滤设置中,我应该注意,大多数值都丢失了,而关键是要对其进行预测,因此要使用截短的SVD解决此类问题,必须使用在该条件下有效的技术。简短说明:

  1. 在做任何事情之前,先拟合一个简单的模型(例如,全局平均值+列和行常数值),只有完成后,才应继续使用截断的SVD来拟合残差。
  2. 初始化长度为k的随机向量(其中,这就是你截断为列)到每一行和每一列(每个电影和用户在Netflix的情况下)。
  3. 保持行向量固定并更新列向量,以最大程度地减少错误 矩阵中已知项的。该程序在本文的matlab代码中给出。
  4. 固定列向量,并以类似方式更新行向量。
  5. 重复3和4,直到收敛或获得足够好的结果。
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.