2016-11-13 3 views
0

Моего R сеанс происходит сбой после того, как превышено время ожидания при попытке вычислить косинус расстояние с большим набором данными (~ 600000 строк)Каков наилучший способ распараллеливать расстояние косинуса?

Для небольших наборов данных, мой код работает, и это пример:

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 может приобрести вас достаточно, чтобы вам не требовалось лишних хлопот распараллеливания. Пример ниже (но я не знаю, как это будет работать в вашей системе/с проблемой реального размера: вектор длиной 1e8 (эквивалентный матрице 10 000 на 10000) принимает 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 около 1331277/17999 = 74 раз быстрее, и могли бы получить вокруг проблемы с памятью, а также (?).

Смежные вопросы