有效地存储一个大但低秩的矩阵
Posted
技术标签:
【中文标题】有效地存储一个大但低秩的矩阵【英文标题】:Storing a large but low-rank matrix efficiently 【发布时间】:2013-03-02 05:03:54 【问题描述】:我知道 R 中有一些包可以有效地存储稀疏矩阵。还有一种方法可以有效地存储低秩矩阵吗?例如:
A <- matrix(rnorm(1e6), nrow=1e5, ncol=1e1)
B <- A %*% t(A)
现在,B
太大而无法存储在内存中,但它的排名较低。有没有什么方法可以有效地构造和存储B
,以便即时执行一些基本的读取方法(rowSums
、colSums
等),以换取 CPU 或内存?
【问题讨论】:
有趣的问题 - 它有哪些应用程序? (低秩矩阵一般出现在哪里?) @DavidRobinson:例如,在某些optimization algorithms 中,这些矩阵被用作大型密集矩阵的近似值(太大而无法计算,甚至无法存储)。 如果你愿意近似B,你能不能用低维近似,例如使用 SVD 并保留 SVD 的前 n 个维度?不确定这是否是您想要的,但可能值得考虑。 虽然它没有回答您的问题,但以下内容似乎有些相关:mathoverflow.net/questions/92328/low-rank-matrix-factorization 是的,我同意上述评论。考虑它,它会变得稀疏。 【参考方案1】:这是另一种方法,虽然我想念这种方法对于大型矩阵的效率有多高:
如果秩低,则表示矩阵包含许多不相关的行,这些行是其他行的线性组合。如果矩阵表示一个线性方程组,则可以设计一种算法,依次删除这些线。
要检查一条线是否不相关,请检查没有该线的矩阵的秩是否仍然相同。矩阵秩的计算见this和that的答案。
【讨论】:
这听起来像是一种非常昂贵的保理方式:-) 抱歉,这是一个非常糟糕的想法,仅适用于具有复制行的简单案例。事实上,生成一个没有重复行或列的秩为 1 的矩阵是很简单的。因此选择随机行向量 U 和 V,然后 U'*V 的秩为 1。【参考方案2】:您的问题已经是答案:要有效地存储如此低的秩矩阵,您需要创建一个包含这两个因素的数据结构。如果需要矩阵向量乘法,可以使用因子的矩阵向量乘积从右到左进行。
这种策略和数据结构的一个应用可以在有限内存 Broyden 或 BFGS 准牛顿方法的实现中找到。
【讨论】:
以上是关于有效地存储一个大但低秩的矩阵的主要内容,如果未能解决你的问题,请参考以下文章