В настоящее время я реализую алгоритм градиентного спуска, который включает в себя метод динамического линейного поиска с использованием метода goldstein-armijo - backtracking.Он работает в определенной степени, но затем не может сходиться, разбивать размер шага и сходиться минимум.Поскольку я относительно новичок в этой теме, я не знаю, как подправить или изменить его, чтобы он больше сходился.
# starting position
startx = np.array([x,y])
x_arr = [startx]
x = x_arr[-1]
beta = 0.1
alpha = 0.00001
# search direction,
# f_gradient returns the gradient
p = -f_gradient(x_arr[-1])
# cutoff
cutoff_thressh = 1*(10**(-8))
#initial stepsize
stp = 1
derphi = np.dot(f_gradient(x),p)
while curr_it < lim_it:
if np.linalg.norm(f_gradient(x)) < cutoff_thressh:
break
# armijo conditions to reduce stepsize
while f(x + stp * p) > (f(x) + alpha * stp * derphi)):
stp*=beta
gradient_mult = stp*f_gradient(x)
x_new = np.subtract(x, gradient_mult)
x_arr.append(x_new.tolist())
любой совет полезен!Спасибо