我在大型数据集(636,688行x 7列)上执行k-means,因此转向并行化。我想迭代一些中心,并且已经包含了一个例子,其中我尝试每次迭代2到5个中心2次。
# Iris k-means parallelization example
library(parallel)
data(iris)
iris.cluster <- iris[,-5]
cl <- makeCluster(detectCores())
worker <- function(data, nclus, nstarts){
kmeans(x = data, centers = nclus, nstart = nstarts)
}
myiter <- 2
nstarts <- rep(25, myiter)
nclus <- 2:5
results <- clusterMap(cl, worker, data = iris.cluster, nclus = nclus, nstarts = nstarts)
stopCluster(cl)
总结已经告诉我一些不妥之处:
> summary(results)
Length Class Mode
Sepal.Length 9 kmeans list
Sepal.Width 9 kmeans list
Petal.Length 9 kmeans list
Petal.Width 9 kmeans list
results
实际上应该有8行,Length
左边没有说明。看起来好像我每个列表条目只使用一个变量。遗憾的是,clusterMap
并不完全清楚,在这种情况下,这是否正确。我现在知道如何迭代种子和nstart
值(谢谢史蒂夫韦斯顿),但需要帮助才能迭代多个簇,如上所述。
答案 0 :(得分:4)
您在将参数正确传递给worker函数时遇到问题。我相信你需要在“中心”和“nstart”上嵌套循环,你还应该将“iris.cluster”导出到集群工作者,因为你不想迭代它。也许这更接近你想要做的事情:
library(parallel)
data(iris)
iris.cluster <- iris[,-5]
cl <- makeCluster(detectCores())
clusterExport(cl, 'iris.cluster')
worker <- function(centers, nstart) {
kmeans(iris.cluster, centers=centers, nstart=nstart)
}
myiter <- 2
nstarts <- rep(25, myiter)
nclus <- 2:5
g <- expand.grid(nstarts=nstarts, nclus=nclus)
results <- clusterMap(cl, worker, centers=g$nclus, nstart=g$nstarts)
stopCluster(cl)
这使用“expand.grid”函数为总共length(nstarts) * length(nclus)
个任务生成参数。