【问题标题】:Speed Up Distance Calculations加快距离计算
【发布时间】:2017-08-10 20:33:36
【问题描述】:

我想加快距离计算。我已经努力将它并行化。不幸的是,它仍然需要一个多小时。

基本上,向量 i 和 j 之间的距离是通过曼哈顿距离计算的。向量的可能值之间的距离在矩阵Vardist 中给出。 Vardist[i[1],j[1]]i[1]j[1] 两个值之间的距离。 (矩阵分别由i[1]j[1]中的字符索引)

距离计算还有一个更重要的补充。向量 i 和 j 之间的距离是向量 i 与向量 j 的任何可能排列之间的所有曼哈顿距离的最小值。这使得它的编程方式计算量很大。

我有 1000 个对象要与另一个对象进行比较。此外,每个对象都是一个长度为 5 的向量。因此每个向量将有 120 个排列。

    distMatrix <- foreach(i = 1:samplesize,
      .combine = cbind,
      .options.snow=opts,
      .packages = c("combinat"))  %dopar%
      {
      # inititalizing matrix
      dist <- rep(0,samplesize)
      # get values on customer i
      ValuesCi <- as.matrix(recodedData[i,])
      # Remove unecessary entries in value distance matrix
      mVardist <- Vardist[ValuesCi,]

      for(j in i:samplesize){
        # distance between vector i and all permutations of vector j is computed
        # minimum of above all distances is taken as distance between vector i and j
        dist[j] <- min(unlist(permn(recodedData[j,], 
                   function(x){ pdist <- 0
                              #nvariables is length of each vector
                              for(i in 1:nvariables){
                              pdist <- pdist + mVardist[i,as.matrix(x)[i]]
                              }
                              return(pdist)}   )))


      }
      dist
      }

非常感谢任何提示或建议!

【问题讨论】:

  • 你的向量有多长?下一步可能是使用Rcpp 来找到j 的所有排列之间的最小距离...
  • 分析将帮助您指导优化工作。例如使用 profvis 包(如果你正在使用它,嵌入在 RStudio 中)
  • 我注意到您在外部 foreach 循环和匿名函数中都使用了 i 。这可能不是一个好主意。

标签: r performance


【解决方案1】:

哦,是的,这段代码需要一段时间。基本原因是您使用显式索引。即使并行化也无济于事。

好的,您可以使用几个选项。

(1) 使用base::dist;给它一个矩阵,它会计算矩阵中各行之间的距离。

(2) 使用一些集群包,例如flexClust,还有其他一些选项。

(3) 如果您需要计算矩阵行与其他矩阵行之间的距离,您可以对代码进行向量化,例如欧式距离:

function(xmat, ymat) {
  t(apply(xmat, 1, function(x) {
    sqrt(colSums((t(ymat) - x)^2))
  }))
}

(4) 使用 C++Rcpp 来利用 BLAS 功能,您甚至可以考虑使用 RcppParallel (distance matrix example) 并行化代码

当您对中型数据有快速例程时,您可能会将其分配到集群……对于大型数据。

【讨论】:

    猜你喜欢
    • 2020-05-17
    • 2013-09-27
    • 2019-08-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多