Prompt Detail:
Перепишем функцию grad_descent_v1
с использованием градиентов:
pythondef grad_descent_v1(f, deriv, x0=None, lr=0.1, iters=100, callback=None):
"""
Реализация градиентного спуска для функций с одним локальным минимумом,
совпадающим с глобальным. Все тесты будут иметь такую природу.
:param f: float -> float — функция
:param deriv: float -> float — её производная
:param x0: float — начальная точка
:param lr: float — learning rate
:param iters: int — количество итераций
:param callback: callable — функция логирования
"""
if x0 is None:
# Если точка не дана, сгенерируем случайную
# из стандартного нормального распределения.
# При таком подходе начальная точка может быть
# любой, а не только из какого-то ограниченного диапазона
# np.random.seed(179)
x0 = np.random.uniform()
x = x0
for i in range(iters):
gradient = deriv(x)
x -= lr * gradient
if callback is not None:
callback(x, f(x))
return x
Здесь мы используем градиент deriv(x)
для вычисления направления, в котором нужно двигаться на каждом шаге. Шаги делаем в сторону, противоположную направлению градиента, умножая его на скорость обучения lr
. Выполняем итерации в цикле, логируя результаты при необходимости.
Add a comment