R 当两次迭代为“时终止梯度下降算法;非常相似”;

R 当两次迭代为“时终止梯度下降算法;非常相似”;,r,terminate,gradient-descent,R,Terminate,Gradient Descent,我在R中实现了梯度下降算法,以找到函数f(x)=1的最小值−氙−它工作得非常好,给了我[1]1作为输出,但它会一直迭代,直到所有30000次迭代都结束,即使迭代之间只有细微的变化(小数点后面有许多位数) 如何向代码中添加一些函数,以便在最后两次迭代非常相似时立即终止它 这是我的代码: # learning rate epsilon = 0.02 # set up a number of iteration iter = 30000 # define the gradient of f(x)

我在R中实现了梯度下降算法,以找到函数f(x)=1的最小值−氙−它工作得非常好,给了我[1]1作为输出,但它会一直迭代,直到所有30000次迭代都结束,即使迭代之间只有细微的变化(小数点后面有许多位数)

如何向代码中添加一些函数,以便在最后两次迭代非常相似时立即终止它

这是我的代码:

# learning rate
epsilon = 0.02

# set up a number of iteration
iter = 30000

# define the gradient of f(x) with given f'(x)
gradient = function(x) return(-exp(-x) + x * exp(-x))

# randomly initialize the x
x = 8

# create a vector to contain all xs for all steps
x.All = vector("numeric",iter)

# gradient descent method to find the minimum
for(i in 1:iter){
  x = x - epsilon*gradient(x)
  x.All[i] = x
  print(x)
}
我尝试过添加以下内容,但没有效果

round (x, digits = 3)
if (x == x - epsilon*gradient) {
break}

我想,因为浮点数x永远不会精确地等于x-epsilon*梯度?

这是您考虑的停止规则的问题:

if (x == x - epsilon*gradient) break
只有当epsilon*gradient恰好为零时,才满足该条件,但当该量足够接近零时,循环应停止。例如,如果
espilon=1
并将
eps2
定义为一个小数字(0.0001),则

if(abs(梯度(x))

会有用的

我永远不会说永远不会。但是,在这种情况下,最好使用像
abs(old_x-new_x)这样的条件。新语法在达到“iter”的数量之前(当它足够接近时)停止迭代。我刚刚把你的if语句整合到我的for语句中。
if (abs(gradient(x)) < eps2) break