Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2020, 23:53   #1
uppupp
 
Регистрация: 05.10.2018
Сообщений: 5
По умолчанию Минимизация функции методом покоординатного спуска

Есть функция "Holt" от двух переменных "alpha" и "beta", которая выдаёт значение "mape". Нужно найти такие значения alpha и beta в диапазоне от 0.0001 до 0.9999, чтобы mape было минимальным. Для этого я использовал метод покоординатного спуска и метод золотого сечения для линейной оптимизации. Данные находятся в списке dt, и после вычисления получаются значения: alpha = 0.6425, beta = 0231, mape = 38.15588, хотя должно быть: alpha = 0.6438, beta = 0.0225, mape = 38.08153. В чем может быть причина? Пользоваться встроенными методами оптимизации нельзя.
Код:
from numpy import mean, sqrt
 
def LOptimisation(data_table, f, fix, commit_index):
  goldR = (1 + sqrt(5)) / 2
  a = 0.0001
  b = 0.9999
  eps = 0.0001
  while(abs(b - a) >= eps):
    x1 = b - (b - a) / goldR
    x2 = a + (b - a) / goldR
    r1 = fix.copy()
    r2 = fix.copy()
    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)
 
def MOptimisation(data_table, f, c):
  eps = 0.0001
  tcoef = [0] * c
  coef = [0.5] * c
  while(abs(f(data_table, tcoef) - f(data_table, coef)) >= eps):
    for i in range(2):
        tcoef = coef.copy()
    for i in range(0, c):
      coef[i] = LOptimisation(data_table, f, coef, i)
  return coef
 
def Holt(data_table, coef):
  alpha = coef[0]
  beta = coef[1]
  ldt = len(data_table)
  ut = [0] * ldt
  bt = [0] * ldt
  ut[0] = data_table[0]
  bt[0] = data_table[1] - data_table[0]
  for i in range(1, ldt):
      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 = []
  for i in range(1, ldt):
    aet.append(abs(data_table[i] - ut[i]))
  ape = []
  for i in range(ldt-1):
    ape.append((aet[i] / data_table[i + 1]) * 100)
  mape = mean(ape)
  return mape
 
dt = [100, 40, 30, 10, 100, 40, 30, 10, 100, 40, 30, 10, 100, 40, 30, 10]
opt = MOptimisation(dt, Holt, 2)
print("ALPHA =", opt[0], "\nBETA =", opt[1], "\nMAPE =", Holt(dt, opt))
uppupp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод конфигураций (циклического покоординатного спуска) xdtab Помощь студентам 0 14.01.2019 18:17
Программа реализации метода покоординатного спуска naty7773 Помощь студентам 2 23.12.2012 19:00
C++ Метод покоординатного спуска Hellgate Помощь студентам 0 12.11.2011 00:42
Метод покоординатного спуска новичочек C++ Builder 0 02.05.2011 15:44
алгоритм покоординатного спуска mimi_mimi Паскаль, Turbo Pascal, PascalABC.NET 0 20.06.2010 18:23