R 加速距离计算
我想加快计算距离的速度。我已经把它并行化了。不幸的是,这仍然需要一个多小时 基本上,向量i和j之间的距离是通过曼哈顿距离计算的。向量的可能值之间的距离在矩阵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的向量
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。这可能不是一个好主意。