R 种子和群集应用-如何选择特定的运行?

R 种子和群集应用-如何选择特定的运行?,r,parallel-processing,k-means,R,Parallel Processing,K Means,我在一个大数据集(636688行x7列)上执行k-means,因此转向了并行化。我的结果必须是可复制的。我可以使用parallel包中的clusterSetRNGStream来执行此操作。下面是使用MASS库中的Boston数据集的示例: library(parallel) cl <- makeCluster(detectCores()) clusterSetRNGStream(cl, iseed = 1234) clusterEvalQ(cl, library(MASS)) result

我在一个大数据集(636688行x7列)上执行k-means,因此转向了并行化。我的结果必须是可复制的。我可以使用
parallel
包中的
clusterSetRNGStream
来执行此操作。下面是使用
MASS
库中的
Boston
数据集的示例:

library(parallel)
cl <- makeCluster(detectCores())
clusterSetRNGStream(cl, iseed = 1234)
clusterEvalQ(cl, library(MASS))
results <- clusterApply(cl, rep(25, 4), function(nstart) kmeans(Boston, 4, nstart = nstart))
check.results <- sapply(results, function(result) result$size)
stopCluster(cl)
如果我将
结果
变量更改为包含
rep(25,2)
而不是
rep(25,4)
,我会得到:

     [,1] [,2]
[1,]   38  268
[2,]  268   98
[3,]   98  102
[4,]  102   38
完美-前2次运行的大小保持不变,无论我运行4次迭代还是仅运行2次。如果继续更改迭代次数,您将看到每个单独的运行保持不变


我的问题-如何在不必跑前3次的情况下,特别挑选第4次跑步?是否在
中的基础
下保存了特定种子?
clusterSetRNGStream
函数不支持您非常想要的那种再现性。问题在于,它只是初始化每个集群工作进程,以从不同的随机数流中提取随机数,当对给定数量的工作进程使用clusterApply时,这些随机数是可复制的。但要执行特定任务,您必须在正确的工作进程上执行它,以获得正确的流,并在该流中快进,即使您知道每个任务所消耗的随机数的确切数目,也不支持这一点

相反,我建议您使用较低级别的函数为每个任务分配不同的随机数子流。您可以通过使用
nextRNGSubStream
函数生成任务种子来实现这一点:

library(parallel)
# This is based on the clusterSetRNGStream function from
# the parallel package, copyrighted by The R Core Team
getseeds <- function(ntasks, iseed) {
  RNGkind("L'Ecuyer-CMRG")
  set.seed(iseed)
  seeds <- vector("list", ntasks)
  seeds[[1]] <- .Random.seed
  for (i in seq_len(ntasks - 1)) {
    seeds[[i + 1]] <- nextRNGSubStream(seeds[[i]])
  }
  seeds
}
results <- clusterMap(cl, worker, nstarts, seeds, MoreArgs=list(centers=5))
关键是从worker函数中设置“.Random.seed”的值,以便为每个任务使用正确的随机数子流:

worker <- function(nstart, seed, centers=4) {
  assign(".Random.seed", seed, envir=.GlobalEnv)
  kmeans(Boston, centers, nstart = nstart)
}
要复制第四个任务的结果,请指定第四个种子:

itasks <- c(4)
results <- clusterMap(cl, worker, nstarts[itasks], seeds[itasks])

@Anna I概括了这个示例,允许指定不同的中心值。谢谢!非常有用。另请参阅以获取进一步讨论
n <- 4
nstarts <- rep(25, n)
seeds <- getseeds(n, 1234)
results <- clusterMap(cl, worker, nstarts, seeds)
itasks <- c(4)
results <- clusterMap(cl, worker, nstarts[itasks], seeds[itasks])
results <- clusterMap(cl, worker, nstarts, seeds, MoreArgs=list(centers=5))