Неточность в нахождении минимума функции в R
Имеется функция:
Holt <- function(data_table, coef)
{
alpha <- coef[1]
beta <- coef[2]
ldt = length(data_table)
ut = bt = numeric(ldt)
for(i in (1:(ldt)))
{
if(i == 1)
{
ut[i] = data_table[i]
bt[i] = data_table[i+1] - data_table[i]
}
else
{
ut[i] = alpha * data_table[i-1] + (1 - alpha) * (ut[i-1] + bt[i-1])
bt[i] = beta * (ut[i] - ut[i-1]) + (1 - beta) * bt[i-1]
}
}
aet = abs(data_table[2:ldt] - ut[2:ldt])
mape = mean(aet[1:(ldt-1)] / data_table[2:ldt]) * 100
return(mape)
}
Мне нужно найти оптимальные значения alpha и beta в диапазоне от 0.0001 до 0.9999, чтобы значение mape было минимальным
Я использовал метод покоординатного спуска и метод золотого сечения для линейной оптимизации:
LOptimisation <- function(data_table, f, fix = NULL, commit_index)
{
goldR = (1 + sqrt(5)) / 2
a = .0001
b = .9999
eps = .0001
while(abs(b - a) > eps)
{
x1 = b - (b - a) / goldR
x2 = a + (b - a) / goldR
r1 <- fix
r2 <- fix
r1[commit_index] <- x1
r2[commit_index] <- x2
if(f(data_table, r1) >= f(data_table, r2)) a <- x1 else b <- x2
}
return(round((a + b) / 2, 4))
}
MOptimisation <- function(data_table, f, c)
{
eps = .0001
coef <- tcoef <- numeric(c)
coef[1:c] <- .5
while(abs(f(data_table, tcoef) - f(data_table, coef)) >= eps)
{
tcoef <- coef
for(i in 1:c) coef[i] <- LOptimisation(data_table, f, coef, i)
}
return(coef)
}
c в данном случае это количество переменных для оптимизации (2), а data_table это вектор входных данных:
c(100, 40, 30, 10, 100, 40, 30, 10, 100, 40, 30, 10, 100, 40, 30, 10)
У меня проблема заключается в том, что оптимальные alpha и beta на выходе получаются 0.6425 и 0.0231 и mape = 38.15588, хотя должно быть alpha = 0.6438, beta = 0.0225, mape = 38.08153