所以我在python中运行一个简单的梯度下降算法,试图找到最小的函数。
我的代码相当简单,我觉得它很直观。我尝试过二阶多项式的简单例子。
def s(x):
return x**2
def t(x):
return 2*x
def steepd(a, alpha, epsilon):
b = a - alpha*t(a)
while abs(t(a)) > epsilon:
if t(b) ==0:
return b
else:
a = b
b = a - alpha*t(a)
return b
print(steepd(2,0.1,0.001))
x = np.arange(-10,10,0.01)
plt.plot(x,s(x))
plt.show()
然而,即使通过显着改变alpha和epsil,我也没有接近最小值。
有人可以指出问题是什么吗?
干杯。
答案 0 :(得分:0)
只有当t(a)
在零epsilon
之内时,您的代码才会终止,因此除非您的缩进被破坏,否则它无法产生违反此约束的值(因为它在你的问题正文)你的代码看起来真的像这样:
def steepd(a, alpha, epsilon):
b = a - alpha*t(a)
while abs(t(a)) > epsilon:
if t(b) ==0:
return b
else:
a = b
b = a - alpha*t(a)
return b
Python中的缩进非常重要。在这里,您的while
循环永远不会运行多次,因为最后的return
语句和steepd
或多或少只是a - alpha*t(a)
。您需要正确缩进代码的return
语句,以便按照您希望的方式运行。