Python 梯度下降运行时误差

Python 梯度下降运行时误差,python,machine-learning,runtime-error,gradient,Python,Machine Learning,Runtime Error,Gradient,我为python做了一个梯度下降的简单实现,它对大多数参数都很好,但是对于学习率和迭代次数的某些参数,它会给我一个运行时错误 RuntimeWarning:双_标量中遇到溢出 RuntimeWarning:在双\u标量中遇到无效值 现在我假设,因为b和m值变得太大,无法存储在内存中,因为有一个溢出错误,这个假设正确吗 我如何防止程序崩溃,因为主程序中的异常处理似乎不起作用,您能想出一种没有异常处理的方法来从逻辑上防止错误吗 def compute_error(points,b,m): e

我为python做了一个梯度下降的简单实现,它对大多数参数都很好,但是对于学习率和迭代次数的某些参数,它会给我一个运行时错误

RuntimeWarning:双_标量中遇到溢出

RuntimeWarning:在双\u标量中遇到无效值

现在我假设,因为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
的值太高,则每次都会迈出太大的一步(想象您在每一步都“跳过”了正确的值)。有几种方法可以计算最大步长应该是多少。谷歌搜索一下(例如“梯度下降步长”)


然而,正如您所注意到的,如果您得到一个溢出,那么结果很可能是错误的。在Python中,您可以使用它来告诉用户结果是错误的。

如果学习率现在太低,无法避免溢出,我们有什么选择。在我的例子中,将学习率设置为0.0001会消除错误,但我的梯度下降即使在2000次迭代中也不会收敛。@AbhyudayaSrinet假设您的算法是正确的,那么您的问题可能不适合于普通的梯度下降。你可以在谷歌上搜索“改善条件反射梯度下降”之类的东西。谢谢。结果我的实现是错误的。我在做oneVsAll分类,并使用标签作为输出值,而我应该使用类标签向量(例如[0,1,0,0])。这帮我弄明白了。