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 代码写作

自举(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 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 代码写作

¡Vamos a practicar!

高效 R 代码写作

Preparing Video For Download...