- •1. Множество. Функция. Скалярные и векторные функции.
- •2. Поле, пространство. Виды пространств.
- •3. Критические точки. Стационарные точки. Лемма Ферма. Связь оптимизации и поиска корня.
- •Вопрос 6. Чем выпуклая функция упрощает задачу оптимизации?
- •Вопрос 7. Если функция имеет одинаковые минимальные значения в двух точках, можно ли говорить о двух глобальных минимумах?
- •Вопрос 8. Как критерии максимума связаны с критериями минимума?
- •4. Градиент. Матрица Гессе. Ряд Тейлора.
- •5. Квадратичная форма. Квадратичная функция. Связь знакоопределенности и собственных чисел матрицы.
- •6. Квадратичная форма. Квадратичная функция. Критерии минимума (максимума) квадратичной формы.
- •7. Условия Вульфа. Их геометрическая интерпретация. Правило Армихо.
- •8. Метод дихотомии. Запрограммировать, показать работу на функциях.
- •9. Метод трехточечного деления. Запрограммировать, показать работу на функциях.
- •10. Метод золотого сечения. Запрограммировать, показать работу на функциях.
- •11. Метод Фибоначчи. Запрограммировать, показать работу на функциях.
- •12. Метод Ньютона одномерный. Запрограммировать, показать работу на функциях.
- •13. Метод секущих. Запрограммировать, показать работу на функциях.
- •14. Метод Мюллера. Запрограммировать, показать работу на функциях.
- •15. Метод обратной параболической интерполяции. Запрограммировать, показать работу на функциях.
- •16. Запрограммировать метод градиентного спуска. Показать его работу на функциях.
- •17. Запрограммировать метод наискорейшего спуска. Показать его работу на функциях.
- •19. Запрограммировать метод Ньютона многомерный. Показать его работу на функциях.
- •20. Запрограммировать метод Левенберга-Марквардта. Показать его работу на функциях.
- •21. Запрограммировать метод Нестерова-Немировского. Показать его работу на функциях.
- •22. Запрограммировать метод Барзилая-Борвейна 1. Показать его работу на функциях.
- •23. Запрограммировать метод Барзилая-Борвейна 2. Показать его работу на функциях.
- •28. Запрограммировать метод Армихо. Показать его работу на функциях.
- •29. Запрограммировать метод dfp. Показать его работу на функциях.
- •30. Запрограммировать метод bfgs. Показать его работу на функциях.
- •31. Запрограммировать метод l- bfgs. Показать его работу на функциях.
- •32. Запрограммировать метод доверительных областей. Показать его работу на функциях.
30. Запрограммировать метод bfgs. Показать его работу на функциях.
В чем заключается основная идея метода БФГШ и к какому классу методов он относится? Метод БФГШ относится к квазиньютоновским методам оптимизации. Его идея состоит в аппроксимации обратной матрицы Гессе без вычисления вторых производных, используя информацию о градиентах:
Hk≈(∇2f(xk))^−1.
Как определяется направление поиска в методе БФГШ? Направление поиска вычисляется по формуле
pk=−Hk∇f(xk).
Какую роль играет матрица Hk в алгоритме БФГШ и что она аппроксимирует? Матрица Hk аппроксимирует обратную матрицу Гессе:
Hk≈(∇2f(xk))^−1,
и используется для учета кривизны целевой функции.
Какие условия должны выполняться, чтобы матрица Hk оставалась положительно определенной? Необходимо выполнение условия кривизны:
yk⊤dk>0,
а также положительная определенность начальной матрицы H0. Обычно это обеспечивается линейным поиском по условиям Вульфа.
Что такое уравнение секущих и зачем оно используется в методе БФГШ? Уравнение секущих имеет вид
Hk+1 yk=dk,
и используется для согласования аппроксимации обратной матрицы Гессе с изменением градиента.
Какие величины обозначаются через dk и yk, и каков их смысл?
dk=xk+1−xk
yk=∇f(xk+1)−∇f(xk).
Вектор dk — шаг по переменным, yk — изменение градиента.
Почему в методе БФГШ требуется линейный поиск и какие методы обычно используются? Линейный поиск нужен для выбора шага αk, обеспечивающего убывание функции и выполнение условия кривизны:
xk+1=xk+αkpk.
Обычно используются правило Армихо и условия Вульфа.
Каковы вычислительная сложность и требования к памяти классического БФГШ? Вычислительная сложность одного шага:
O(n2),
память:
O(n2).
В чем заключаются основные проблемы применения БФГШ для задач большой размерности? Основная проблема — необходимость хранения матрицы Hk∈Rn×nH, что приводит к высоким затратам памяти и вычислений.
В каких задачах метод БФГШ особенно эффективен по сравнению с градиентным спуском? Метод БФГШ эффективен для гладких задач средней размерности, где учет кривизны ускоряет сходимость по сравнению с методом градиентного спуска.
31. Запрограммировать метод l- bfgs. Показать его работу на функциях.
В чем заключается основная идея метода БФГШ и к какому классу методов он относится?
Метод БФГШ относится к квазиньютоновским методам оптимизации. Его основная идея состоит в аппроксимации обратной матрицы Гессе целевой функции с помощью информации о градиентах, что позволяет избежать прямого вычисления вторых производных и при этом использовать кривизну функции для ускорения сходимости.
32. Запрограммировать метод доверительных областей. Показать его работу на функциях.
Идея:
мы не доверяем модели функции далеко от текущей точки, поэтому на каждом шаге минимизируем приближение функции только внутри небольшой области вокруг текущей точки.
В одном предложении (идеально для ответа)
Метод доверительных областей — это метод оптимизации, в котором на каждом шаге минимизируется локальная модель функции внутри ограниченной области, а размер этой области адаптивно изменяется в зависимости от качества аппроксимации.
внутри модели используется метод золотого сечения
def goldensectionsearch(f, interval, tol):
a = interval[0]
b = interval[1]
Phi = (1 + np.sqrt(5)) / 2
L = b - a
x1 = b - L / Phi
x2 = a + L / Phi
y1 = f(x1)
y2 = f(x2)
neval = 2
xmin = x1
fmin = y1
# main loop
while np.abs(L) > tol:
if y1 > y2:
a = x1
xmin = x2
fmin = y2
x1 = x2
y1 = y2
L = b - a
x2 = a + L / Phi
y2 = f(x2)
neval += 1
else:
b = x2
xmin = x1
fmin = y1
x2 = x1
y2 = y1
L = b - a
x1 = b - L / Phi
y1 = f(x1)
neval += 1
answer_ = [xmin, fmin, neval]
return answer_
def pparam(pU, pB, tau):
if (tau <= 1):
p = np.dot(tau, pU)
else:
p = pU + (tau - 1) * (pB - pU)
return p
эта функция ищет минимум квадратичной модели
def doglegsearch(mod, g0, B0, Delta, tol):
# dogleg local search
xcv = np.dot(-g0.transpose(), g0) / np.dot(np.dot(g0.transpose(), B0), g0)
pU = xcv * g0
xcvb = inv(- B0)
pB = np.dot(inv(- B0), g0)
func = lambda x: mod(np.dot(x, pB))
al = goldensectionsearch(func, [-Delta / norm(pB), Delta / norm(pB)], tol)[0]
pB = al * pB
func_pau = lambda x: mod(pparam(pU, pB, x))
tau = goldensectionsearch(func_pau, [0, 2], tol)[0]
pmin = pparam(pU, pB, tau)
if norm(pmin) > Delta:
pmin_dop = (Delta / norm(pmin))
pmin = np.dot(pmin_dop, pmin)
return pmin
def Hnew(dk, yk, H):
p1 = np.dot(dk, dk.transpose()) / np.dot(dk.transpose(), yk)
p2 = np.dot(np.dot(np.dot(H, yk), yk.transpose()), H) / np.dot(np.dot(yk.transpose(), H), yk)
return H + p1 - p2
def trustreg(f, df, x0, tol):
# PLACE YOUR CODE HERE
eta = 0.1 порог n
delta = 0.25
coords = []
radii = []
B = np.eye(2) начальная модель
H = np.eye(2) начальная модель
f0 = f(x0)
g0 = df(x0)
rmax = 0.1
k = 0
kmax = 1000
dx = 1
while (norm(dx) >= tol) and (k < kmax):
mk = lambda x: f0 + np.dot(np.array(x).transpose(), g0) + 1 / 2 * np.dot(np.dot(np.array(x).transpose(), B),
np.array(x))
p0 = doglegsearch(mk, g0, B, delta, tol)
ro = ((f(x0) - f(x0 + p0)) / (mk(0) - mk(p0)))[0][0]
if (ro > eta):
xnew = x0 + p0
else:
xnew = x0
if (ro < 0.25):
delta = 0.25 * delta
elif (ro > 0.75 and norm(p0) == delta):
delta = min(2 * delta, rmax)
coords.append(xnew)
radii.append(delta)
gnew = df(xnew)
dx = xnew - x0
dy = gnew - g0
H = Hnew(dx, dy, H)
B = np.linalg.inv(H)
f0 = f(xnew)
x0 = xnew
g0 = gnew
k += 1
xmin = x0
fmin = f(xmin)
neval = k
answer_ = [xmin, fmin, neval, coords, radii]
return answer_
