用户,
我正在寻找一种解决方案来“并行化”我的 PLSR 预测以节省处理时间。我试图将“foreach”构造与“doPar”一起使用(参见下面代码的第二部分),但我无法将预测值以及模型性能参数 (RMSEP) 分配给输出变量。
编码:
set.seed(10000) # generate some data...
mat <- replicate(100, rnorm(100))
y <- as.matrix(mat[,1], drop=F)
x <- mat[,2:100]
eD <- dist(x, method = "euclidean") # distance matrix to find close samples
eDm <- as.matrix(eD)
kns <- matrix(NA,nrow(x),10) # empty matrix to allocate 10 closest samples
for (i in 1:nrow(eDm)) { # identify closest samples in a loop and allocate to kns
kns[i,] <- head(order(eDm[,i]), 11)[-1]
}
到目前为止,我认为代码是“安全的”,但下一部分对我提出了挑战,因为我以前从未使用过“foreach”构造:
library(pls)
library(foreach)
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
out <- foreach(j = 1:nrow(mat), .combine="rbind", .packages="pls") %dopar% {
pls <- plsr(y ~ x, ncomp=5, validation="CV", , subset=kns[j,])
predict(pls, ncomp=5, newdata=x[j,,drop=F])
RMSEP(pls, estimate="CV")$val[1,1,5]
}
stopCluster(cl)
据我了解,以“RMSEP(pls,...”开头的代码行只是覆盖了“预测”代码行中先前写入的数据。不知何故,我假设该.combine
选项会解决这个问题?
非常感谢您的帮助!
最好的,切加