Gói parallel - parSapply

Viết mã R hiệu quả

Colin Gillespie

Jumping Rivers & Newcastle University

Họ hàm apply

Có các phiên bản song song của

  • apply() - parApply()
  • sapply() - parSapply()
    • áp dụng một hàm cho một vector, tức là một vòng lặp for
  • lapply() - parLapply()
    • áp dụng một hàm cho một list
Viết mã R hiệu quả

Hàm sapply()

sapply() chỉ là một cách khác để viết vòng lặp for

Vòng lặp

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

Có thể viết thành

sapply(1:10, simulate)

Ta đang áp dụng một hàm cho từng giá trị của một vector

Viết mã R hiệu quả

Chuyển sang parSapply()

Cùng một công thức!

  1. Tải gói
  2. Tạo cluster
  3. Chuyển sang parSapply()
  4. Dừng!
Viết mã R hiệu quả

Ví dụ: Trận đấu Pokemon

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

Viết mã R hiệu quả

Bootstrapping

Trong thế giới lý tưởng, ta sẽ lấy mẫu lại từ population; nhưng ta không thể

Thay vào đó, giả định mẫu gốc đại diện cho population

  1. Lấy mẫu có hoàn nguyên từ dữ liệu
    • Cùng một điểm có thể xuất hiện nhiều lần
  2. Tính thống kê tương quan từ mẫu mới
  3. Lặp lại
Viết mã R hiệu quả

Một lần bootstrap

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))
Viết mã R hiệu quả

Chuyển sang chạy song song

  • Tải gói
  • Chỉ định số core
  • Tạo một đối tượng cluster
  • Xuất hàm/dữ liệu
  • Đổi sang parSapply()
  • Dừng!
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)
Viết mã R hiệu quả

Thời gian chạy

Viết mã R hiệu quả

Cùng luyện tập nào!

Viết mã R hiệu quả

Preparing Video For Download...