【问题标题】:Aggregating large matrices聚合大型矩阵
【发布时间】:2016-03-10 03:43:01
【问题描述】:

我有矩阵 A,我想创建矩阵 B,其中:

第 1 列 = 矩阵 A 的第 1 列

第 2 列 = 两列的聚合,其中矩阵 A 的第 1 列与其最相关的矩阵 A 的任何列聚合

第 3 列 = 三列的聚合,其中聚合结果(矩阵 B 的第 2 列)与与其最相关的 A 的任何列进行聚合(除了已经包含的矩阵 A 中的列,这一列已经从矩阵 A 中删除)

等等

我循环计算相关性,在这里我计算每次迭代中的所有相关性。这适用于 r 和 n 的低值(为了简单起见,我在此示例中选择了低值),但对于较大的数据集需要很长时间。有没有更快/更有效的方法来做到这一点?最好是一种我不必在每次迭代中计算所有相关性的方法。我已经尝试过bigcor()等功能,但目前没有成功。

【问题讨论】:

    标签: r


    【解决方案1】:

    将它移到 for 循环之外。它不依赖于imaxcor <- names(which.max(sapply(A[,-1, drop=F], function(x) cor(A[, 1], x) )))

    r <- 10 # rows
    n <- 6 # columns
    
    library(microbenchmark)
    microbenchmark(OP = {
      A <- data.frame(matrix(rnorm(r*n),nrow=r)) # original data frame
      B <- data.frame(matrix(nrow=r,ncol=n)) # results
      B[,1] <- A[,1]
      for (i in 2:n) {
        maxcor <- names(which.max(sapply(A[,-1, drop=F], function(x) cor(A[, 1], x) )))
        B[,i] <- A[,1] + A[,maxcor]
        A[,1] <- B[,i]
        A[,maxcor] <- NULL
      }
    },
    ALEX= {
      A2 <- data.frame(matrix(rnorm(r*n),nrow=r)) # original data frame
      B2 <- data.frame(matrix(nrow=r,ncol=n)) # results
      B2[,1] <- A2[,1]
      A3 <- A2
      maxcor <- sapply(A3[,-1, drop=F], function(x) cor(A3[, 1], x) )
      cor_n <- names(A2)[order(maxcor, decreasing=T)]
      for (i in 1:length(cor_n)) {
        B2[,i+1] <- A2[,1] + apply(A2[,cor_n[1:i], drop= FALSE], 1, sum)
      }
    }, times=100L)
    
    
    Unit: milliseconds
     expr      min       lq     mean   median       uq      max neval cld
       OP 1.779013 1.806192 1.915267 1.835082 1.941329 3.585394   100   b
     ALEX 1.229343 1.253102 1.386429 1.300428 1.377404 2.925868   100  a 
    

    30% 的性能提升...这是数据A3 &lt;- A2 的额外副本,显然可以删除

    【讨论】:

    • 当我必须重复该过程 n-1 次时,如何将其置于循环之外?
    • 还有什么不清楚的地方?我想更清楚地解释一下。
    • 你试图做的事情背后的概念对我来说毫无意义(统计上)。但我想我现在可能理解编码问题了......让我调试并重写我的答案
    • 感谢您的这种方法,它确实看起来确实快得多。但是,为什么要创建 A3? A2 还不够吗?
    • @Joseph 是的(如我所述)。我在调试中创建它,并没有在意完全调试和删除它...如果它有帮助,请考虑支持并接受
    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多