我正在Python中实现一个算法,使用gradient descent方法来寻找二维函数的最近最小值。它以一个精度区间eps作为输入,当给定迭代的初始点和新发现点之间的距离小于eps时停止。该阶段的代码如下所示:
while(slow_steps <= 4):
lbd_current = lbd(x_current)
x_previous = x_current.copy()
grad = normalized_gradient(f_multi, x_previous)
x_current = [x_previous[i] + lbd_current * grad[i] for i in range(len(x_previous))]
x_list.append(x_current.copy())
iteration += 1
if(distance(x_previous, x_current) <= eps):
slow_steps += 1
然而,我在算法的初始版本中遇到了一个问题:根据函数的不同,它经常陷入诸如this one之类的“低谷”
到目前为止,我已经尝试添加第二步来遍历山谷:如果算法检测到下降速度很慢,而不是立即结束,它将获取最新和第三到最新迭代中找到的点,并在这些点之间的直线上找到最近的低点,这条直线有望与山谷的方向对齐
if(distance(x_previous, x_current) <= eps * 10 and canyon_steps >= 3):
x_canyon = x_list[len(x_list) - 2]
vector_canyon = [x_current[i] - x_canyon[i] for i in range(len(x_canyon))]
lbd_current = lbd_canyon()
x_current = [x_canyon[i] + vector_canyon[i] * lbd_current for i in range(len(x_canyon))]
if(distance(x_previous, x_current) > eps):
canyon_steps = 0
slow_steps = 0
if(distance(x_previous, x_current) <= eps * 10):
canyon_steps += 1
这个算法适用于我尝试过的大多数起始位置,但对于其他位置,如this one,如果精度较低,则会失败,否则似乎需要很长时间才能完成。我如何确保算法以尽可能好的机会到达局部最小值
目前没有回答
相关问题 更多 >
编程相关推荐