parallel 套件 - parSapply

撰寫高效 R 程式碼

Colin Gillespie

Jumping Rivers & Newcastle University

apply 家族

{{1}} 有對應的平行版本

  • 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 程式碼

自助抽樣(Bootstrapping)

理想狀況下,我們會從母體重抽樣;但做不到

因此假設原始樣本能代表母體

  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 次獨立自助抽樣模擬
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...