1. Učit se
  2. /
  3. Kurzy
  4. /
  5. Optimizing R Code with Rcpp

Connected

cvičení

Klouzavé průměry

Klouzavé průměry (někdy zvané pohyblivé průměry) se v analýze časových řad používají k vyhlazení šumu. Hodnota v každém časovém bodě se nahradí průměrem hodnot v okolních bodech (okno).

Přirozený způsob, jak tuto funkci zapsat, je:

rollmean1 <- function(x, window = 3) {
  n <- length(x)
  res <- rep(NA, n)
  for(i in seq(window, n)) {
    res[i] <- mean(x[seq(i - window + 1, i)])
  }
  res
}

Tato funkce volá mean() mnohokrát, což je neefektivní. Jedno z řešení je použít proměnnou total, takže v každé iteraci smyčky odečteš prvek, který už nepotřebuješ, a přičteš nový.

rollmean2 <- function(x, window = 3){
  n <- length(x)
  res <- rep(NA, n)
  total <- sum(head(x, window))
  res[window] <- total / window
  for(i in seq(window + 1, n)) {
    total <- total + x[i] - x[i - window]
    res[i] <- total / window
  }
  res
}

V každém případě je zápis smyčkového kódu přirozenější než vektorizovaný přístup, což může snižovat výkon. Obě verze výše jsou každá svým způsobem neefektivní. Než napíšeš C++ verzi v příštím cvičení, zkusme napsat variantu využívající vektorizaci. V pracovním prostředí máš k dispozici funkce rollmean1(), rollmean2() a náhodný vektor x. Teď dokončíš definici funkce rollmean3() a porovnáš výkon všech tří funkcí.

Pokyny 1/2

undefined XP
    1
    2
  • Vypočítej součet prvních window prvků vektoru x.
  • Vypočítej other_totals jako initial_total plus kumulativní součet (cumsum()) rozdílu lasts minus firsts.
  • Doplň výstupní vektor: první hodnotou bude initial_total děleno window, ostatní hodnoty budou other_totals děleno window.