-1

所以我想在 Python 中做一个梯度下降,这样我就可以找到 f 的全局最小值,其中 x=10,学习率为 0.01,epsilon 为 0.00001 和最大值。迭代次数为 10000

# parameters to set
x = 10 # Starting value of x
alpha = 0.01 # Set learning rate
epsilon = 0.00001 # Stop algorithm when absolute difference between 2 consecutive x-values is less than epsilon
max_iter = 10000 # set maximum number of iterations

# Define function and derivative of function
f = lambda x: x**4-3*x**3+15
fprime = lambda x: 4*x**3-9*x**2

# Initialising
diff = 1 # initialise difference between 2 consecutive x-values
iter = 1 # iterations counter

# Now Gradient Descent
while diff > epsilon and iter < max_iter: # 2 stopiing criteria
    x_new = x - alpha * fprime(x) # update rule
    print("Iteration ", iter, ": x-value is:", x_new,", f(x) is: ", f(x_new) )
    diff = abs(x_new - x)
    iter = iter + 1
    x = x_new
    
print("The local minimum occurs at: ", x)

但问题是,当我运行整个代码时,它只能打印出 5 次迭代,然后我遇到 OverFlowError 消息。

--

4

1 回答 1

1

您的学习率太高,从而导致您观察到的分歧。的值alpha = 0.001收敛到局部最小值:

# parameters to set
x = 10 # Starting value of x
alpha = 0.001 # Set learning rate
epsilon = 0.00001 # Stop algorithm when absolute difference between 2 consecutive x-values is less than epsilon
max_iter = 10000 # set maximum number of iterations

# Define function and derivative of function
f = lambda x: x**4-3*x**3+15
fprime = lambda x: 4*x**3-9*x**2

# Initialising
diff = 1 # initialise difference between 2 consecutive x-values
iter = 1 # iterations counter

# Now Gradient Descent
while diff > epsilon and iter < max_iter: # 2 stopiing criteria
    x_new = x - alpha * fprime(x) # update rule
    print("Iteration ", iter, ": x-value is:", x_new,", f(x) is: ", f(x_new) )
    diff = abs(x_new - x)
    iter = iter + 1
    x = x_new
    
print("The local minimum occurs at: ", x)
于 2020-07-30T04:29:07.330 回答