Brownovo exponenciálne vyrovnávanie
Exponenciálne vyrovnávanie navrhol v roku 1956 pán Robert Goodel Brown, neskôr ho v roku 1957 rozšíril pán Charles Holt. Ide o techniku, pomocou ktorej je možné dáta časového radu vyhladiť a zároveň urobiť predpoveď na budúce obdobie.
Brownovo exponenciálne vyrovnávanie je určené pre nesezónne dáta a umožňuje rôzne typy trendov:
- Jednoduché exponenciálne vyrovnávanie – konštantný trend
- Dvojité exponenciálne vyrovnávanie – lineárny trend
- Trojité exponenciálne vyrovnávanie – kvadratický trend
Predtým než začneme, je dobré si pripraviť vektor dát, na ktoré budeme exponenciálne vyrovnávanie aplikovať. Dáta sú dostupné aj v podobe reálnych údajov.
Príklad vytvorenia dátového vektora v R:
data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39, 13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61, 11.41, 11.33, 11.33, 11.3, 10.87)
Brownovo jednoduché exponenciálne vyrovnávanie v Rcran so zvolením parametra alfa
Exponenciálne vyrovnávanie je možné realizovať aj v prostredí R, pomocou vlastnej funkcie, ktorá zohľadňuje zvolený parameter α
.
Nižšie uvedená funkcia vypočíta MSE (mean squared error), vypíše odhadované hodnoty Y a poskytne aj predpoveď na jedno obdobie dopredu.
Funkcia BA()
pracuje s dátovým vektorom a zvolenou hodnotou parametra alfa. Okrem toho automaticky vykreslí graf pôvodných a vyhladených hodnôt.
BA = function(vector, alpha) { avg_vector = sum(vector) / length(vector) pom_vector = 1:length(vector) pom_vector[1] = alpha * vector[1] + (1 - alpha) * avg_vector for (i in 2:length(vector)) { pom_vector[i] = alpha * vector[i] + (1 - alpha) * pom_vector[i - 1] } est_vector = 1:length(vector) est_vector[1] = avg_vector est_vector[2] = pom_vector[1] for (i in 3:length(vector)) { est_vector[i] = pom_vector[i - 1] } residuals = (vector - est_vector)^2 MSE = mean(residuals) forecast = pom_vector[length(vector)] cat("Zvolená alfa:", alpha, "\nMSE:", MSE, "\nForecast:", forecast, "\n") plot(vector, type = "o", col = "blue", ylim = range(c(vector, est_vector))) lines(est_vector, type = "o", col = "red") points(length(vector) + 1, forecast, col = "brown", pch = 19) }
Ukážka použitia funkcie:
data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39, 13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61, 11.41, 11.33, 11.33, 11.3, 10.87) BA(data, 0.3)
Táto funkcia vykreslí originálne hodnoty (modrá), odhadované hodnoty (červená) a predikciu pre ďalšie obdobie (hnedá).
Brownovo jednoduché exponenciálne vyrovnávanie v Rcran s výpočtom optimálneho parametra alfa
Táto funkcia vykonáva to isté ako predchádzajúca verzia, avšak navyše automaticky vyhľadáva hodnotu parametra α
, pri ktorej je stredná kvadratická chyba MSE najnižšia.
Funkcia prechádza interval od 0 do 0.7 a vyhodnocuje výsledky po zadanom kroku.
BO = function(vector, step) { alpha = step best_alpha = alpha min_mse = Inf best_forecast = NA best_est = rep(0, length(vector)) while (alpha <= 0.7) { avg = mean(vector) smooth = rep(0, length(vector)) smooth[1] = alpha * vector[1] + (1 - alpha) * avg for (i in 2:length(vector)) { smooth[i] = alpha * vector[i] + (1 - alpha) * smooth[i-1] } est = c(avg, smooth[1:(length(vector)-1)]) mse = mean((vector - est)^2) if (mse < min_mse) { min_mse = mse best_alpha = alpha best_est = est best_forecast = smooth[length(vector)] } alpha = alpha + step } cat("Najlepšia hodnota α:", best_alpha, "\nNajnižšie MSE:", min_mse, "\nForecast:", best_forecast, "\n") plot(vector, type="o", col="blue", ylim=range(c(vector, best_est))) lines(best_est, type="o", col="red") points(length(vector)+1, best_forecast, col="brown", pch=19) }
Ukážka použitia funkcie:
data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39, 13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61, 11.41, 11.33, 11.33, 11.3, 10.87) BO(data, 0.05)
Modrá línia predstavuje pôvodné hodnoty, červená vyhladené hodnoty s optimálnym α
a hnedý bod označuje predikciu na ďalšie obdobie.
Brownovo dvojité exponenciálne vyrovnávanie v Rcran so zvolením parametra alfa
Táto funkcia vykonáva dvojité exponenciálne vyrovnávanie, ktoré je vhodné pre časové rady s lineárnym trendom. Výpočet vyžaduje výber hodnoty parametra α
a na jeho základe určuje strednú kvadratickú chybu MSE, predikciu a vyhladené hodnoty.
Funkcia tiež automaticky vykreslí graf s originálnymi hodnotami, odhadom a predpoveďou na jedno obdobie dopredu.
BEA = function(vector, alpha) { time = 1:length(vector) regr = lm(vector ~ time) b0 = regr$coef[1] b1 = regr$coef[2] st1 = b0 - (b1 * (1 - alpha) / alpha) st2 = b0 - (2 * b1 * (1 - alpha) / alpha) smooth1 = numeric(length(vector)) smooth2 = numeric(length(vector)) smooth1[1] = alpha * vector[1] + (1 - alpha) * st1 for (i in 2:length(vector)) { smooth1[i] = alpha * vector[i] + (1 - alpha) * smooth1[i - 1] } smooth2[1] = alpha * smooth1[1] + (1 - alpha) * st2 for (i in 2:length(vector)) { smooth2[i] = alpha * smooth1[i] + (1 - alpha) * smooth2[i - 1] } b_t = (alpha / (1 - alpha)) * (smooth1 - smooth2) a_t = 2 * smooth1 - smooth2 est_vector = c(b0 + b1) for (i in 2:length(vector)) { est_vector[i] = a_t[i - 1] + b_t[i - 1] } mse = mean((vector - est_vector)^2) forecast = a_t[length(vector)] + b_t[length(vector)] cat("Zvolená α:", alpha, "\nMSE:", mse, "\nForecast:", forecast, "\n") plot(vector, type = "o", col = "blue", ylim = range(c(vector, est_vector))) lines(est_vector, type = "o", col = "red") points(length(vector) + 1, forecast, col = "brown", pch = 19) }
Ukážka použitia funkcie:
data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39, 13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61, 11.41, 11.33, 11.33, 11.3, 10.87) BEA(data, 0.3)
Modrá línia predstavuje pôvodné hodnoty, červená línia je dvojito vyhladený odhad a hnedý bod označuje predikciu do ďalšieho obdobia.
Brownovo dvojité exponenciálne vyrovnávanie v Rcran s výpočtom optimálneho parametra alfa
Táto funkcia rozširuje klasické dvojité exponenciálne vyrovnávanie o výpočet optimálnej hodnoty parametra α, pri ktorej je MSE (mean squared error) najnižšia.
Parametre funkcie umožňujú definovať krok hľadania v rámci intervalu 0–0.7
.
Výstupom sú okrem optimálneho α aj odhadované hodnoty Y, predpoveď na ďalšie obdobie a graf zobrazujúci pôvodné aj vyhladené dáta.
BEO = function(vector, step) { time = 1:length(vector) regr = lm(vector ~ time) b0 = regr$coef[1] b1 = regr$coef[2] alpha = step j = 0 iterations = 0.7 / step MSE_data = numeric(iterations) parameter_alpha = alpha data_memory = numeric(length(vector)) forecast = numeric(iterations) while (alpha <= 0.7) { j = j + 1 st1 = b0 - (b1 * (1 - alpha) / alpha) st2 = b0 - (2 * b1 * (1 - alpha) / alpha) pom = numeric(length(vector)) pom2 = numeric(length(vector)) pom[1] = alpha * vector[1] + (1 - alpha) * st1 for (i in 2:length(vector)) pom[i] = alpha * vector[i] + (1 - alpha) * pom[i - 1] pom2[1] = alpha * pom[1] + (1 - alpha) * st2 for (i in 2:length(vector)) pom2[i] = alpha * pom[i] + (1 - alpha) * pom2[i - 1] b1t = (alpha / (1 - alpha)) * (pom - pom2) b0t = 2 * pom - pom2 est_vector = numeric(length(vector)) est_vector[1] = b0 + b1 for (i in 2:length(vector)) est_vector[i] = b0t[i - 1] + b1t[i - 1] residuals = (vector - est_vector)^2 MSE_data[j] = mean(residuals) if (j == 1 || MSE_data[j] < min(MSE_data[1:j])) { data_memory = est_vector parameter_alpha = alpha forecast[j] = b0t[length(vector)] + b1t[length(vector)] } alpha = alpha + step } MSE = min(MSE_data) cat("Optimálne α:", parameter_alpha, "\nNajnižšie MSE:", MSE, "\nForecast:", forecast[which.min(MSE_data)], "\n") plot(vector, type = "o", col = "blue", ylim = range(c(vector, data_memory))) lines(data_memory, type = "o", col = "red") points(length(vector) + 1, forecast[which.min(MSE_data)], col = "brown", pch = 19) }
Ukážka použitia funkcie:
data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39, 13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61, 11.41, 11.33, 11.33, 11.3, 10.87) BEO(data, 0.05)
Výsledný graf zobrazuje pôvodné hodnoty (modrá), optimálne vyhladené hodnoty (červená) a predikciu na ďalší časový bod (hnedá).
Brownovo trojité exponenciálne vyrovnávanie v Rcran so zvolením parametra alfa
Trojitá forma exponenciálneho vyrovnávania umožňuje modelovať kvadratické trendy v časových radoch. Táto verzia funkcie vyžaduje výber parametra α
a následne vykonáva vyhladenie, výpočet odhadovaných hodnôt Y, hodnoty MSE a predikcie do ďalšieho obdobia.
Výsledkom je aj automatické vykreslenie grafu s originálnymi, vyhladenými a predikovanými hodnotami.
BTA = function(vector, alpha) { time1 = 1:length(vector) time2 = time1^2 time = cbind(time1, time2) regr = lm(vector ~ time) b0 = regr$coef[1] b1 = regr$coef[2] b2 = regr$coef[3] st01 = b0 - (b1 * (1 - alpha) / alpha) + (1 - alpha) * (2 - alpha) / (alpha^2) * b2 st02 = b0 - (2 * b1 * (1 - alpha) / alpha) + (1 - alpha) * (3 - 2 * alpha) / (alpha^2) * 2 * b2 st03 = b0 - (3 * b1 * (1 - alpha) / alpha) + 3 * (1 - alpha) * (4 - 3 * alpha) / (alpha^2) * b2 st1 = numeric(length(vector)); st1[1] = alpha * vector[1] + (1 - alpha) * st01 for (i in 2:length(vector)) { st1[i] = alpha * vector[i] + (1 - alpha) * st1[i - 1] } st2 = numeric(length(vector)); st2[1] = alpha * st1[1] + (1 - alpha) * st02 for (i in 2:length(vector)) { st2[i] = alpha * st1[i] + (1 - alpha) * st2[i - 1] } st3 = numeric(length(vector)); st3[1] = alpha * st2[1] + (1 - alpha) * st03 for (i in 2:length(vector)) { st3[i] = alpha * st2[i] + (1 - alpha) * st3[i - 1] } b0t = 3 * st1 - 3 * st2 + st3 b1t = (alpha / (2 * (1 - alpha)^2)) * ((6 - 5 * alpha) * st1 - 2 * (5 - 4 * alpha) * st2 + (4 - 3 * alpha) * st3) b2t = (alpha^2 / (1 - alpha)^2) * (st1 - 2 * st2 + st3) est_vector = numeric(length(vector)); est_vector[1] = b0 + b1 + b2 for (i in 2:length(vector)) { est_vector[i] = b0t[i - 1] + b1t[i - 1] + b2t[i - 1] } residuals = (vector - est_vector)^2 mse = mean(residuals) forecast = b0t[length(vector)] + b1t[length(vector)] + b2t[length(vector)] / 2 cat("Zvolená α:", alpha, "\nMSE:", mse, "\nForecast:", forecast, "\n") plot(vector, type = "o", col = "blue", ylim = range(c(vector, est_vector))) lines(est_vector, type = "o", col = "red") points(length(vector) + 1, forecast, col = "brown", pch = 19) }
Ukážka použitia funkcie:
data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39, 13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61, 11.41, 11.33, 11.33, 11.3, 10.87) BTA(data, 0.3)
V grafe budú vykreslené: pôvodné hodnoty (modrá), trojito vyhladené odhady (červená) a predikcia pre ďalší časový bod (hnedá).
Brownovo trojité exponenciálne vyrovnávanie v Rcran s výpočtom optimálneho parametra alfa
Táto funkcia rozširuje klasické trojité exponenciálne vyrovnávanie o výpočet optimálnej hodnoty parametra α, pri ktorej je MSE (mean squared error) najnižšie.
Parametre funkcie umožňujú definovať krok hľadania v rámci intervalu 0–0.7
.
Výstupom sú okrem optimálneho α aj odhadované hodnoty Y, predpoveď na ďalšie obdobie a graf zobrazujúci pôvodné aj vyhladené dáta.
BTO(data, 0.05) # BTO = funkcia # data = vektor hodnôt # 0.05 = krok pre hľadanie najlepšieho alfa
Skrátený popis algoritmu:
- Pre každé α z intervalu
(0, 0.7]
sa vypočíta predikcia a MSE. - Hodnota α s najnižším MSE je vybraná ako optimálna.
- Graf zobrazí pôvodné hodnoty (modrá), vyhladené hodnoty (červená) a predikciu (hnedá).
Príklad použitia funkcie:
data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39, 13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61, 11.41, 11.33, 11.33, 11.3, 10.87) BTO(data, 0.05)
Výstup funkcie zobrazí optimálny parameter α, najnižšiu hodnotu MSE, odhadované hodnoty a predikciu na ďalšie obdobie.