parallel 패키지 - parSapply

효율적인 R 코드 작성

Colin Gillespie

Jumping Rivers & Newcastle University

apply 계열 함수

apply 계열 함수의 병렬 버전이 존재합니다

  • apply()- parApply()
  • sapply()- parSapply()
    • 벡터에 함수 적용, 즉 for 루프
  • lapply()- parLapply()
    • 리스트에 함수 적용
효율적인 R 코드 작성

sapply() 함수

sapply()는 for 루프를 작성하는 또 다른 방법입니다

루프

for(i in 1:10)
    x[i] <- simulate(i)

다음과 같이 작성할 수 있습니다

sapply(1:10, simulate)

벡터의 각 값에 함수를 적용합니다

효율적인 R 코드 작성

parSapply()로 전환

동일한 절차입니다!

  1. 패키지 불러오기
  2. 클러스터 생성
  3. parSapply()로 전환
  4. 중지!
효율적인 R 코드 작성

예시: 포켓몬 배틀

plot(pokemon$Defense, pokemon$Attack)
abline(lm(pokemon$Attack ~ pokemon$Defense), col = 2)
cor(pokemon$Attack, pokemon$Defense)
0.437

효율적인 R 코드 작성

부트스트래핑

이상적으로는 모집단에서 재표본을 추출해야 하지만, 현실적으로는 불가능합니다

대신, 원래 표본이 모집단을 대표한다고 가정합니다

  1. 데이터에서 _복원_ 추출로 표본 추출
    • 동일한 데이터 포인트가 여러 번 나타날 수 있습니다
  2. 새 표본에서 상관 통계량 계산
  3. 반복
효율적인 R 코드 작성

단일 부트스트랩

bootstrap <- function(data_set) {
    # Sample with replacement
    s <- sample(1:nrow(data_set), replace = TRUE)
    new_data <- data_set[s,]

    # Calculate the correlation
    cor(new_data$Attack, new_data$Defense)
}
# 100 independent bootstrap simulations
sapply(1:100, function(i) bootstrap(pokemon))
효율적인 R 코드 작성

병렬 처리로 변환

  • 패키지 불러오기
  • 코어 수 지정
  • 클러스터 객체 생성
  • 함수/데이터 내보내기
  • parSapply()로 전환
  • 중지!
library("parallel")
no_of_cores <- 7
cl <- makeCluster(no_of_cores)
clusterExport(cl,
  c("bootstrap", "pokemon"))
parSapply(cl, 1:100,
  function(i) bootstrap(pokemon))
stopCluster(cl)
효율적인 R 코드 작성

실행 시간

효율적인 R 코드 작성

이제 연습해 봅시다!

효율적인 R 코드 작성

Preparing Video For Download...