当我试图用大数据集计算余弦距离时,我的R会话在超时超过后崩溃(~600,000行)
对于小型数据集,我的代码工作,这是一个例子:
library(lsa)
relevant.data <- as.matrix(mtcars)
cosine(t(relevant.data))
我在这个网站上读过一些文章来并行余弦函数,但是没有运气。
是否存在一个非常有效的方法?
你认为rccp喜欢这篇文章吗?并行余弦距离聚类在R中的应用
如果像相关矩阵这样的计算效率很低。你有什么建议?
发布于 2016-11-13 13:32:35
在Rcpp
中编写代码可能会给您带来足够的开销,因此您不需要额外的并行处理。下面的例子(但我不知道它在您的系统上会做什么/对于一个实际大小的问题):长度1e8的向量(相当于10,000乘10,000矩阵)需要763 be,所以即使将结果存储在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版本,从这里略作修改
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倍,并且可能(?)帮你解决内存问题。
https://stackoverflow.com/questions/40578876
复制相似问题