我在R中实现了梯度下降算法以找到函数f(x)= 1-xe-x的最小值,它非常有效并且给出了[1] 1作为输出,但是一直迭代直到所有30.000次迭代结束,即使迭代之间只有微小的变化(小数点后面有许多数字)。
如何在代码中添加一些函数,一旦最后两次迭代非常相似就会终止它?
这是我的代码:
# 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 *渐变?
答案 0 :(得分:0)
您考虑的停止规则存在问题:
if (x == x - epsilon*gradient) break
只有当epsilon * gradient
正好为零时才会满足条件,但是当该数量足够接近零时,循环应该停止。例如,如果espilon=1
和定义eps2
是一个小数字(0.0001),那么
if (abs(gradient(x)) < eps2) break
会奏效。