แพ็กเกจ parallel - parSapply

การเขียน R Code อย่างมีประสิทธิภาพ

Colin Gillespie

Jumping Rivers & Newcastle University

ตระกูล apply

มีเวอร์ชันแบบขนานของ

  • apply()- parApply()
  • sapply()- parSapply()
    • ใช้ฟังก์ชันกับเวกเตอร์ เช่นเดียวกับ for loop
  • lapply()- parLapply()
    • ใช้ฟังก์ชันกับลิสต์
การเขียน R Code อย่างมีประสิทธิภาพ

ฟังก์ชัน sapply()

sapply() คือวิธีเขียน for loop อีกแบบหนึ่ง

ลูป

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

เขียนใหม่ได้เป็น

sapply(1:10, simulate)

เราใช้ฟังก์ชันกับแต่ละค่าในเวกเตอร์

การเขียน R Code อย่างมีประสิทธิภาพ

เปลี่ยนไปใช้ parSapply()

ใช้สูตรเดิม!

  1. โหลดแพ็กเกจ
  2. สร้างคลัสเตอร์
  3. เปลี่ยนไปใช้ parSapply()
  4. หยุด!
การเขียน R Code อย่างมีประสิทธิภาพ

ตัวอย่าง: การต่อสู้ของโปเกมอน

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

การเขียน R Code อย่างมีประสิทธิภาพ

Bootstrapping

ในอุดมคติ เราควรสุ่มตัวอย่างจาก ประชากร ทั้งหมด แต่ทำไม่ได้

แทนที่ เราสมมติว่าตัวอย่างเดิมแทนประชากรได้

  1. สุ่มตัวอย่างแบบ มีการคืนค่า จากข้อมูลของคุณ
    • จุดเดิมอาจถูกเลือกซ้ำได้
  2. คำนวณค่าสถิติสหสัมพันธ์จากตัวอย่างใหม่
  3. ทำซ้ำ
การเขียน R Code อย่างมีประสิทธิภาพ

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))
การเขียน R Code อย่างมีประสิทธิภาพ

แปลงเป็นแบบขนาน

  • โหลดแพ็กเกจ
  • ระบุจำนวนคอร์
  • สร้างออบเจกต์คลัสเตอร์
  • ส่งออกฟังก์ชัน/ข้อมูล
  • เปลี่ยนไปใช้ 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 Code อย่างมีประสิทธิภาพ

เวลาที่ใช้

การเขียน R Code อย่างมีประสิทธิภาพ

มาฝึกกันเถอะ!

การเขียน R Code อย่างมีประสิทธิภาพ

Preparing Video For Download...