R中快速并行二部距离计算 [英] Fast parallel bipartite distance calculation in R

查看:27
本文介绍了R中快速并行二部距离计算的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在具有并行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()函数支持并行计算两部分距离。

基准wordspaceparallelDist

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没有针对稀疏性进行优化。例如,有tcross Prod、rowSums和外部函数等效项的可并行化稀疏矩阵实现。

这篇关于R中快速并行二部距离计算的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆