2014-02-11 1 views
2

큰 데이터 세트 (636,688 행 × 7 열)에서 k- 평균을 수행 중이므로 병렬 처리가 필요합니다. 센터의 수를 반복하고 2 ~ 5 개의 센터를 2 번 반복하는 예제를 포함하고 싶습니다.병렬 패키지의 clusterMap - 여러 매개 변수를 반복합니다.

# 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

먼저 iris.cluster를 반복하지 않아야하므로 데이터 인수를 다르게 지정해야합니다. 둘째, 지금은 2 차원 문제가있는 것 같지만 잘못 지정하고 있습니다. 먼저 코드의 순차적 인 버전을 해결하는 것이 도움이 될 수 있습니다. –

+0

만약'clusterMap'에서'iris.cluster'를 꺼내려고한다면 - 이미 정의되어 있습니다 -'cl <- makeCluster (detectCores()) worker <- function (nclus, nstarts) { kmeans (x) = iris.cluster, 센터 = nclus, n 다음 = nstarts) } myiter <- 2 nstarts <- 렙 (25 myiter) nclus <- 2 : 5 개 결과 <- clusterMap (CL, 작업자 nclus = nclus , nstarts = nstarts) stopCluster (cl)', 다음 오류가 발생합니다 :'checkForRemoteErrors (val)의 오류 : 4 개 노드에서 오류가 발생했습니다. 첫 번째 오류 : 개체 'iris.cluster'을 (를) 찾을 수 없습니다. 감사! –

+0

작업자 함수에는 "iris.cluster"가 필요하지만 반복 변수로 전달하면 안됩니다. 그렇지 않으면 분할됩니다. clusterExport를 통해 작업자로 내보내기하거나 clusterMap MoreArgs 인수를 사용하여 전달하십시오. –

답변

4

작업자 함수에 인수를 제대로 전달하는 데 문제가 있습니다. "센터"와 "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) 

이것은 length(nstarts) * length(nclus) 작업의 총 인수를 생성하기 위해 "expand.grid"기능을 사용합니다.