Напишите функцию gradient_descent(), реализующую алгоритм градиентного спуска для функции f(x). На вход она принимает:

  • initialization — начальное значение вектора x;
  • step_size — размер шага μ;
  • iterations — количество итераций.

Функция возвращает значение вектора x после заданного числа итераций. Проверьте функцию на разных количествах итераций (уже в прекоде).

import numpy as np
 
def func(x):
    return (x[0] + x[1] - 1)**2 + (x[0] - x[1] - 2)**2
 
def gradient(x):
    return np.array([4 * x[0] - 6, 4 * x[1] + 2])
 
def gradient_descent(initialization, step_size, iterations):
    x = initialization
    for i in range(iterations):
        x = x - step_size * (gradient(x))
    return x 

print(gradient_descent(np.array([0, 0]), 0.1, 5))
print(gradient_descent(np.array([0, 0]), 0.1, 100))

Результат

[ 1.38336 -0.46112]
[ 1.5     -0.5]

Спустились. Но без ветерка. Найти минимум за пять шагов алгоритм не успевает, а вот за 100 — с лёгкостью.