【发布时间】:2015-03-17 17:49:37
【问题描述】:
我正在尝试计算矩阵中列之间的余弦相似度。我可以使用标准 for 循环让它工作,但是当我尝试让它并行运行以使代码运行得更快时,它并没有给我相同的答案。问题是我无法使用 foreach 循环方法得到相同的答案。我怀疑我没有使用正确的语法,因为我有单个 foreach 循环工作。我试图使第二个循环成为一个常规的 for 循环,并且我在 foreach 循环中使用了 %:% 参数,但是该函数甚至没有运行。
请在下面查看我的附加代码。提前感谢您的帮助。
## Function that calculates cosine similarity using paralel functions.
#for calculating parallel processing
library(doParallel)
## Set up cluster on 8 cores
cl = makeCluster(8)
registerDoParallel(cl)
#create an example data
x=array(data=sample(1000*100), dim=c(1000, 100))
## Cosine similarity function using sequential for loops
cosine_seq =function (x) {
co = array(0, c(ncol(x), ncol(x)))
for (i in 2:ncol(x)) {
for (j in 1:(i - 1)) {
co[i, j] = crossprod(x[, i], x[, j])/sqrt(crossprod(x[, i]) * crossprod(x[, j]))
}
}
co = co + t(co)
diag(co) = 1
return(as.matrix(co))
}
## Cosine similarity function using parallel for loops
cosine_par =function (x) {
co = array(0, c(ncol(x), ncol(x)))
foreach (i=2:ncol(x)) %dopar% {
for (j in 1:(i - 1)) {
co[i, j] = crossprod(x[, i], x[, j])/sqrt(crossprod(x[, i]) * crossprod(x[, j]))
}
}
co = co + t(co)
diag(co) = 1
return(as.matrix(co))
}
## Calculate cosine similarity
tm_seq=system.time(
{
x_cosine_seq=cosine_seq(x)
})
tm_par=system.time(
{
x_cosine_par=cosine_par(x)
})
## Test equality of cosine similarity functions
all.equal(x_cosine_seq, x_cosine_par)
#stop cluster
stopCluster(cl)
【问题讨论】:
标签: r parallel-processing parallel-foreach