Градиентный спуск функции Розенброка
Мне необходимо выполнить градиентный спуск функции Розенброка: (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, я получаю вовсе не такие значения. Я совершенно не понимаю, в чём состоит проблема. Возможно, я некорректно выполняю градиентный спуск для функции с двумя переменными. Подскажите, пожалуйста что не так.