2016-11-13 81 views
0

我R对话崩溃后超过超时当我尝试计算与大数据集(〜60万线)这是平行余弦距离的最佳方法吗?

对于小型数据集,我的代码工作的余弦距离,这是一个例子:

library(lsa) 
relevant.data <- as.matrix(mtcars) 
cosine(t(relevant.data)) 

我已阅读本网站上的一些帖子来并行化余弦函数,但没有运气。

做了非常有效的方法存在吗?

你建议RCCP喜欢这个岗位? Parallel cosine distance using clusterapply in R

如果计算类似的相关矩阵是低效的。你有什么建议?

+0

我在第三行发生错误。请修复它。 – nicola

+0

谢谢。缺失)(我从我的手机) – pachamaltese

+0

错误仍然存​​在。请花点时间问一个好问题。张贴之前始终测试您的示例。如果你现在不能,那么稍后再做。 – nicola

回答

2

Rcpp编码它可能给你买不够,你不需要并行化的额外的麻烦。下面的例子(但我不知道它会怎么做您的系统上/用真实大小的问题:10,000矩阵长度1E8的载体(相当于10,000)需要763MB,所以即使存储结果的问题60^2倍大(= 2.75Tb,如果我正确计算的话)可能会很困难......)。

x <- as.matrix(mtcars) 
library(lsa) 

lsa功能:

cosine(as.matrix(mtcars)) 

略简装R代码里面:

cosR <- function(x) { 
     co <- array(0, c(ncol(x), ncol(x))) 
     ## f <- colnames(x) 
     ## dimnames(co) <- list(f, f) 
     for (i in 2:ncol(x)) { 
     for (j in 1:(i - 1)) { 
      co[i,j] <- crossprod(x[,i], x[,j])/ 
       sqrt(crossprod(x[,i]) * crossprod(x[,j])) 
     } 
    } 
    co <- co + t(co) 
    diag(co) <- 1 
    return(as.matrix(co)) 
} 

RCPP版本,从here略加修改:

library(Rcpp) 
library(RcppArmadillo) 
cppFunction(depends='RcppArmadillo', 
      code="NumericMatrix cosCpp(NumericMatrix Xr) { 
      int n = Xr.nrow(), k = Xr.ncol(); 
      arma::mat X(Xr.begin(), n, k, false); // reuses memory and avoids extra copy 
      arma::mat Y = arma::trans(X) * X; // matrix product 
      arma::mat res = Y/(arma::sqrt(arma::diagvec(Y)) * arma::trans(arma::sqrt(arma::diagvec(Y)))); 
      return Rcpp::wrap(res); 
      }") 

测试平等:

identical(cosR(x),unname(cosine(x))) 
all.equal(cosCpp(x),cosR(x)) 

library(microbenchmark) 
microbenchmark(cosine(x),cosR(x),cosCpp(x)) 
## Unit: nanoseconds 
##  expr min  lq  mean median  uq  max neval cld 
## cosine(x) 460046 1181837 2069604.51 1530719 2528021 8757989 100 b 
## cosR(x) 542414 1096448 1915011.12 1331277 2321596 11740233 100 b 
## cosCpp(x)  7 12472 35827.76 17999 30556 644551 100 a 

的RCPP版本快约17999分之1331277= 74倍,并且可能会在你身边的内存问题,以及(?)。