【发布时间】: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