R将代码转换为在共享内存中运行

时间:2018-02-16 15:34:20

标签: r parallel-processing multicore mclapply

以下代码有助于了解最佳群集的数量。

set.seed(123)

# function to compute total within-cluster sum of square 
wss <- function(k) {
  kmeans(df, k, nstart = 10 )$tot.withinss
}

# Compute and plot wss for k = 1 to k = 15
k.values <- 1:15

# extract wss for 2-15 clusters
wss_values <- map_dbl(k.values, wss)

plot(k.values, wss_values,
       type="b", pch = 19, frame = FALSE, 
       xlab="Number of clusters K",
       ylab="Total within-clusters sum of squares")

参考:https://uc-r.github.io/

目标是将其转换为在具有多个内核的共享内存中运行,以便快速完成。 fviz_nbclust尝试使用此方法并且速度非常慢。

接近/尝试:

首先,在wss

中创建要调用的mclapply方法
parallel.wss <- function(i, k) {
    set.seed(101)
    kmeans(df, k, nstart=i)$tot.withinss
}

此处i是并行启动的数量,k实际上是k.values,这是我们需要尝试找到最佳的群集数量。

k.values <- 1:15

kmean_results <- mclapply(c(25,25,25,25), k.values, FUN=parallel.wss)

但得到了以下警告:

Warning message:
In mclapply(c(25, 25, 25, 25), k.values, FUN = parallel.wss) :
  all scheduled cores encountered errors in user code

查看kmean_results对象:

  

头(kmean_results)   [[1]]   [1]“kmeans中的错误(df,k,nstart = i):\ n在'x'和'centers'中必须具有相同的列数\ n”   ATTR( “类”)   [1]“尝试错误”   ATTR( “条件”)   

1 个答案:

答案 0 :(得分:1)

使用foreach,您可以

ncores <- parallel::detectCores(logical = FALSE)
cl <- parallel::makeCluster(ncores)
doParallel::registerDoParallel(cl)
library(foreach)
wss_values2 <- foreach(k = k.values, .combine = 'c') %dopar% {
  kmeans(df, k, nstart = 10)$tot.withinss
}
parallel::stopCluster(cl)

如果将kmeans调用包装在函数中,则需要将所有变量作为参数传递(dfk)。