2016-11-13 46 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倍,並且可能會在你身邊的內存問題,以及(?)。