Градиентный спуск функции Розенброка

Мне необходимо выполнить градиентный спуск функции Розенброка: (1 - x)**2 + 100 * (y - x**2)**2. Я сделал функции для неё самой и её производных и попытался выполнить градиентный спуск:

import numpy as np

def f(x, y):
  return (1 - x)**2 + 100 * (y - x**2)**2

def gradx_f(x, y):
  return -2 + 2*x - 400*x*y + 400*x**2

def grady_f(x, y):
  return 200*y - 200*x**2

def grad_desc(start, extra_start, learning_rate, n_iterations):
  x = start
  y = extra_start
  trajx = [x]
  trajy = [y]
  fx = f(x, y)
  for i in range(n_iterations):
    grx = x - learning_rate * gradx_f(x, y)
    gry = y - learning_rate * grady_f(x, y)
    trajx.append(grx)
    trajy.append(gry)
  return np.array(trajx), np.array(trajy)


x0 = np.random.randint(-10, 11)
y0 = np.random.randint(-10, 11)

trajx, trajy = grad_desc(x0, y0, 0.001, 10000)
print(f'Минимальная x в: {trajx[-1]}')
print(f'Минимальная y в минимальной x: {f(trajx[-1], trajy[-1])}')

Но вместо ожидаемых 1 и 1, я получаю вовсе не такие значения. Я совершенно не понимаю, в чём состоит проблема. Возможно, я некорректно выполняю градиентный спуск для функции с двумя переменными. Подскажите, пожалуйста что не так.


Ответы (0 шт):