我想加快距离计算。我已经努力并行化它。不幸的是,它仍然需要一个多小时。
基本上,矢量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
}
非常感谢任何提示或建议!
答案 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)并行化代码
当您拥有中型数据的快速例程时,您可能会将其分发到集群...以获取大数据。