加速距离计算

时间:2017-03-19 16:03:06

标签: r performance

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

基本上,矢量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
      }

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

1 个答案:

答案 0 :(得分:1)

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

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

(1)使用console.log;给它一个矩阵,它将计算矩阵中行之间的距离。

(2)使用一些群集包,例如base::dist,还有其他一些选择。

(3)如果你需要计算matix行与其他矩阵的行之间的距离,你可以对代码进行矢量化,例如:欧几里德距离:

flexClust

(4)使用 C ++ function(xmat, ymat) { t(apply(xmat, 1, function(x) { sqrt(colSums((t(ymat) - x)^2)) })) } 来使用 BLAS 功能,您甚至可以考虑使用RcppParallel (distance matrix example)并行化代码

当您拥有中型数据的快速例程时,您可能会将其分发到集群...以获取大数据。