我已经为 python 实现了梯度下降的简单实现,它对大多数参数都适用,但对于某些学习率和迭代次数的参数,它会给我一个运行时错误。
运行时警告:在双标量中遇到溢出
运行时警告:在双标量中遇到无效值
现在我假设因为它达到了 b 和 m 值变得太大而无法存储在内存中,因为存在溢出错误,这个假设是否正确?
以及如何防止程序崩溃,因为主程序中的异常处理似乎不起作用,您能想出一种无需异常处理的方法来从逻辑上防止错误吗?
def compute_error(points,b,m):
error = 0
for i in range(len(points)):
y = ponts[i][1]
x = points[i][0]
error += (y - (m*x + b))**2
return error/len(points)
def gradient_runner(points,LR,num_iter,startB=0,startM=0):
b = startB
m = startM
for i in range(num_iter):
b,m = step_gradient(points,b,m,LR)
return [b,m]
def step_gradient(points,b,m,LR):
b_gradient = 0
m_gradient = 0
N = float(len(points))
for i in range(len(points)):
x = points[i][0]
y = points[i][1]
b_gradient+= (-2/N)*(y - ((m*x)+b))
m_gradient+= (-2/N)*x*(y - ((m*x)+b))
## print "Value for b_gradient",b_gradient
## print "Value for b is ",b
## print "Value for learning rate is ",LR
new_b = b - (LR * b_gradient)
new_m = m - (LR * m_gradient)
return [new_b,new_m]
import numpy as np
a = np.array([[1,1],[4,2],[6,3],[8,4],[11,5],[12,6],[13,7],[16,8]])
b,m=gradient_runner(a,0.0001,1000) # These parameters work
# b,m=gradient_runner(a,0.1,10000) #Program Crashes
yguesses = [m * i + b for i in a[:,0]]
import matplotlib.pyplot as plt
guezz= yguesses
plt.scatter(a[:,0], a[:,1] ,color="green")
plt.plot(a[:,0],guezz,color="red")
plt.show()
最佳答案
问题是“学习率”LR(通过仅改变 LR 来测试这个——你会发现如果你足够低,算法会收敛)。如果 LR
的值太高,您每次都会迈出太大的一步(假设您在每一步都“跳过”正确的值)。有一些方法可以计算最大步长应该是多少。 Google 一下(例如“梯度下降步长”)。
但是,正如您所注意到的,如果出现溢出,结果很可能是错误的。在 Python 中你可以 catch warnings ,您可以使用它来告诉用户结果是错误的。
关于python - 梯度下降运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45548283/