Кодирование в 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 раз быстрее, и могли бы получить вокруг проблемы с памятью, а также (?).
Я получаю сообщение об ошибке на третьей строке. Пожалуйста, исправьте это. – nicola
Спасибо. Отсутствует) (я со своего мобильного телефона) – pachamaltese
Ошибка по-прежнему сохраняется. Пожалуйста, примите должное время, чтобы задать хороший вопрос. Всегда проверяйте свой пример перед публикацией. Если вы не можете сейчас, сделайте это позже. – nicola