R 将代码转换为共享内存中的 运行
R converting code to run in shared memory
以下代码有助于理解最佳集群的数量。
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")
目标是在多核共享内存中将其转换为 运行,以便快速完成。 fviz_nbclust
尝试使用此方法,但速度极慢。
Approach/Attempt:
首先,创建要在 mclapply
中调用的 wss
方法
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
对象:
head(kmean_results)
[[1]]
[1] "Error in kmeans(df, k, nstart = i) : \n must have same number of columns in 'x' and 'centers'\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
有了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
调用包装在一个函数中,则需要将所有变量作为参数传递(df
和 k
)。
以下代码有助于理解最佳集群的数量。
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")
目标是在多核共享内存中将其转换为 运行,以便快速完成。 fviz_nbclust
尝试使用此方法,但速度极慢。
Approach/Attempt:
首先,创建要在 mclapply
wss
方法
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
对象:
head(kmean_results) [[1]] [1] "Error in kmeans(df, k, nstart = i) : \n must have same number of columns in 'x' and 'centers'\n" attr(,"class") [1] "try-error" attr(,"condition")
有了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
调用包装在一个函数中,则需要将所有变量作为参数传递(df
和 k
)。