Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 加速距离计算_R_Performance - Fatal编程技术网

R 加速距离计算

R 加速距离计算,r,performance,R,Performance,我想加快计算距离的速度。我已经把它并行化了。不幸的是,这仍然需要一个多小时 基本上,向量i和j之间的距离是通过曼哈顿距离计算的。向量的可能值之间的距离在矩阵Vardist中给出Vardist[i[1],j[1]]是两个值i[1]和j[1]之间的距离。(矩阵分别由i[1]和j[1]中的字符索引) 距离计算还有一个更重要的补充。向量i和j之间的距离是向量i和向量j的任何可能排列之间的所有曼哈顿距离的最小值。这使得它的编程方式计算量很大 我有1000件东西要和另一件比较。此外,每个对象是长度为5的向量

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

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

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

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

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

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

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

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

(4)使用C++和 Rcpp < /C> >使用BLAS功能,甚至可以考虑使用

并行代码
当您拥有中等大小数据的快速例程时,您可以将其分发到集群。。。对于大数据。

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