r - R中的快速并行二分距离计算

标签 r optimization distance rcpp

具有并行化 Rcpp 后端的 R 中二分距离的最快计算是什么?parallelDist是一个带有 cpp 后端并支持多线程的很棒的包,但不支持二分距离计算(据我所知)。
使用 parallelDist()用于二分距离矩阵计算。 除了 m1:m2 之外,这还涉及计算 m1:m1 和 m2:m2——效率非常低。

library(parallelDist)

bipartiteDist <- function(matrix1,matrix2){
  matrix12 <- rbind(matrix1,matrix2)
  d <- parallelDist(matrix12)
  d <- as.matrix(d)[(1:nrow(matrix1)),((nrow(matrix1)+1):(nrow(matrix1)*2))]
  d
}

matrix1 <- abs(matrix(rnorm(1000),10,100000))
matrix2 <- abs(matrix(rnorm(1000),10,100000))

dist <- bipartiteDist(matrix1, matrix2)
当超过 3 个内核可用时,此方法比 pDist 或纯 R 实现更快。pdist非常适合计算二分距离,但不支持多线程。
并行化二分距离计算的任何快速实现?

最佳答案

wordspace dist.matrix() 函数支持并行计算二部距离。
基准测试 wordspace反对 parallelDist

matrix1 <- abs(matrix(rnorm(1000),100,100000))
matrix2 <- abs(matrix(rnorm(1000),100,100000))

library(rbenchmark)
library(parallelDist)
library(wordspace)

bipartiteDist_parallelDist <- function(matrix1,matrix2){
  matrix12 <- rbind(matrix1,matrix2)
  d <- parallelDist(matrix12, method = "euclidean")
  d <- as.matrix(d)[(1:nrow(matrix1)),((nrow(matrix1)+1):(nrow(matrix1)*2))]
  d
}

bipartiteDist_wordspace <- function(matrix1,matrix2){
  wordspace.openmp(threads = wordspace.openmp()$max)
  dist.matrix(matrix1,matrix2, byrow = TRUE, method = "euclidean", convert = FALSE)
}

benchmark("parallelDist" = {
            bd1 <- bipartiteDist_parallelDist(matrix1,matrix2)
          },
          "wordspace" = {
            bd2 <- bipartiteDist_wordspace(matrix1,matrix2)
          },
          replications = 1,
          columns = c("test", "replications", "elapsed",
                      "relative", "user.self", "sys.self"))

plot(bd1,bd2) # yes, both methods give near-identical results
基准测试结果:
          test replications elapsed relative user.self sys.self
1 parallelDist            1   2.120   12.184   126.145    0.523
2    wordspace            1   0.174    1.000     3.749    0.252
我用了 80 个线程。
进一步提高速度的框架 wordspace作者承认强调低内存负载而不是速度,因此额外的速度增益是可能的(source)。
例如,这里是欧几里得距离的一般框架:
bipartiteDist3 <- function(matrix1,matrix2){
  m1tm2 <- tcrossprod(matrix1,matrix2)
  sq1 <- rowSums(matrix1^2)
  sq2 <- rowSums(matrix2^2)
  out0 <- outer(sq1, sq2, "+") - 2 * m1tm2
  sqrt(out0)
}
我对针对稀疏矩阵优化的并行化解决方案非常感兴趣。据我所知,wordspace不针对稀疏性进行优化。例如,存在 tcrossprod、rowSums 和外部函数等价物的可并行化稀疏矩阵实现。

关于r - R中的快速并行二分距离计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64464885/

相关文章:

optimization - XQuery 分组和聚合函数总是很慢吗?

寻找附近点的算法?

r - 如何找到R中连续坐标之间的距离?

r - Shiny :在多个选项卡中重复使用相同的绘图不起作用

将长数据框 reshape 为宽数据框并使用一列作为前缀重命名新列

r - 合并列时如何删除缺失值(NA)?

c++ - 难以衡量 C/C++ 性能

r - 我可以用R计算z分数吗?

mysql - 查询花费太多时间(100k 条记录需要 3 分钟)

r - 计算一定半径内的点数