假设我有一个密集矩阵的大小,带 SVD 分解
R
我可以计算 SVD 如下svd(A)
:
如果一个新的-th 行被添加到, 是否可以根据旧的 SVD 分解计算新的 SVD 分解(即通过使用,, 和),无需从头开始重新计算 SVD?
假设我有一个密集矩阵的大小,带 SVD 分解
R
我可以计算 SVD 如下svd(A)
:
如果一个新的-th 行被添加到, 是否可以根据旧的 SVD 分解计算新的 SVD 分解(即通过使用,, 和),无需从头开始重新计算 SVD?
是的,可以在向现有矩阵添加一个新行后更新 SVD 分解。
通常,这种“加一”问题表述被称为一级更新。@amoeba 提供的关于“特征值分解的有效二级更新”的 MathOverflow 链接是一个很好的第一步,如果您想开始更深入地研究这个问题;第一篇论文为您的具体问题提供了明确的解决方案。只是为了澄清一阶和二阶的含义,这样您就不会感到困惑,如果您的新是这样的:
在哪里和是向量,那么您将其称为一级更新(或扰动)。此更新的基本内容由Sherman-Morrison 公式决定。. 如果扰动超过一个等级,即。
伍德伯里公式开始发挥作用。如果您看到这些公式,您会注意到其中涉及很多逆。您不直接解决这些问题。由于您已经解决了他们的大量子系统(即您已经计算了一些分解),您可以利用这些来获得更快和/或更稳定的估计。(这就是人们仍在研究这个领域的原因。)我经常参考 JE Gentle 的《计算统计》一书。我认为章。5数值线性代数将正确设置您。(不幸的是,Harville 的经典著作:“从统计学家的角度看矩阵代数”根本没有涉及排名更新。)
从统计/应用方面来看,排名第一的更新在推荐系统中很常见,因为每次新用户注册或新产品出现时,可能会有数千个客户条目并重新计算 SVD(或任何给定的分解)添加或删除是非常浪费的(如果不是无法实现的话)。通常推荐系统矩阵是稀疏的,这使得算法更加高效。第一篇文章是 M. Brand 的“轻量级推荐系统的快速在线 SVD 修订”手稿。进入密集矩阵我认为查看 Pattern Recognition and Imaging Processing 的论文可以让你在使用实际算法方面走得很远。例如论文:
所有人似乎都在核心解决同样的问题;新功能正在出现,我们需要相应地快速更新我们的表示。请注意,这些矩阵不是对称的,甚至不是正方形的。M. Brand 的另一项工作也可以解决这个问题(参见论文“ Fast low-rank modifys of the thin奇异值分解(2006) ”——这也在帖子开头给出的 MO 链接中提到。)有一个很多关于这个主题的优秀论文,但大多数都倾向于数学化(例如,Benaych-Georgesa 和 Nadakuditi 论文“大型矩形随机矩阵的低秩扰动的奇异值和向量”(2012 年)") 而且我认为它们不会很快帮助您找到解决方案。我建议您继续关注图像处理文献。
不幸的是,我没有遇到任何一级更新例程的 R 实现。Computational Science SE 中关于“ Python、C 或 Fortran 中的可更新 SVD 实现? ”的答案提供了许多您可能想要考虑的 MATLAB 和 C++ 实现。通常 R、Python 等实现是 C、C++ 或 FORTRAN 实现的包装器。