Balíček parallel - parSapply

Efektivní kód v R

Colin Gillespie

Jumping Rivers & Newcastle University

Rodina apply

Existují paralelní verze funkcí

  • apply()- parApply()
  • sapply()- parSapply()
    • aplikace funkce na vektor, tj. smyčka for
  • lapply()- parLapply()
    • aplikace funkce na seznam
Efektivní kód v R

Funkce sapply()

sapply() je jen jiný způsob zápisu smyčky for

Smyčka

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

Lze zapsat jako

sapply(1:10, simulate)

Aplikujeme funkci na každou hodnotu vektoru

Efektivní kód v R

Přepnutí na parSapply()

Stejný postup!

  1. Načtení balíčku
  2. Vytvoření clusteru
  3. Přepnutí na parSapply()
  4. Zastavení!
Efektivní kód v R

Příklad: Pokémon souboje

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

Efektivní kód v R

Bootstrapping

V ideálním případě bychom vzorkovali z populace, to však není možné

Předpokládáme, že původní vzorek je reprezentativní pro populaci

  1. Vzorek s opakováním z dat
    • Stejný bod se může objevit vícekrát
  2. Výpočet korelace z nového vzorku
  3. Opakování
Efektivní kód v R

Jednoduchý 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))
Efektivní kód v R

Převod na paralelní zpracování

  • Načtení balíčku
  • Určení počtu jader
  • Vytvoření objektu clusteru
  • Export funkcí/dat
  • Přepnutí na parSapply()
  • Zastavení!
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)
Efektivní kód v R

Časování

Efektivní kód v R

Pojďme si procvičit!

Efektivní kód v R

Preparing Video For Download...