【问题标题】: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,以便即时执行一些基本的读取方法(rowSumscolSums 等),以换取 CPU 或内存?

【问题讨论】:

  • 有趣的问题 - 它有哪些应用程序? (低秩矩阵一般出现在哪里?)
  • @DavidRobinson:例如,在某些optimization algorithms 中,这些矩阵被用作大型密集矩阵的近似值(太大而无法计算,甚至无法存储)。
  • 如果你愿意近似B,你能不能用低维近似,例如使用 SVD 并保留 SVD 的前 n 个维度?不确定这是否是您想要的,但可能值得考虑。
  • 虽然它没有回答您的问题,但以下内容似乎有些相关:mathoverflow.net/questions/92328/low-rank-matrix-factorization
  • 是的,我同意上述评论。考虑它,它会变得稀疏。

标签: r matrix rank cran


【解决方案1】:

这是另一种方法,虽然我想念这种方法对于大型矩阵的效率有多高:

如果秩低,则表示矩阵包含许多不相关的行,这些行是其他行的线性组合。如果矩阵表示一个线性方程组,则可以设计一种算法,依次删除这些线。

要检查一条线是否不相关,请检查没有该线的矩阵的秩是否仍然相同。矩阵秩的计算见thisthat的答案。

【讨论】:

  • 这听起来像是一种非常昂贵的保理方式:-)
  • 抱歉,这是一个非常糟糕的想法,仅适用于具有复制行的简单案例。事实上,生成一个没有重复行或列的秩为 1 的矩阵是很简单的。因此选择随机行向量 U 和 V,然后 U'*V 的秩为 1。
【解决方案2】:

您的问题已经是答案:要有效地存储如此低的秩矩阵,您需要创建一个包含这两个因素的数据结构。如果需要矩阵向量乘法,可以使用因子的矩阵向量乘积从右到左进行。

这种策略和数据结构的一个应用可以在有限内存 Broyden 或 BFGS 准牛顿方法的实现中找到。

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2021-12-07
    • 2016-12-26
    • 1970-01-01
    • 2018-04-16
    • 2012-09-02
    • 1970-01-01
    • 2020-09-08
    • 2018-02-10
    相关资源
    最近更新 更多