当前位置: 首页 > 知识库问答 >
问题:

Y截距在线性回归梯度下降中不改变

胡景焕
2023-03-14

我目前正在学习梯度下降,所以我写了一段代码,使用梯度下降和线性回归。然而,我得到的这条线并不是最好的。我计算了梯度下降线性回归和最小二乘误差回归的误差。无论我使用什么数据,最小二乘误差总是给我一个更低的误差。我决定看一看斜坡和y截距。使用梯度下降的y截距总是非常接近于零,好像它没有正确地改变。我觉得这很奇怪,我不知道发生了什么。我是否错误地实现了梯度下降?

import matplotlib.pyplot as plt
datax=[]
datay=[]
def gradient(b_current,m_current,learningRate):
    bgradient=0
    mgradient=0
    N=float(len(datax))
    for i in range(0,len(datax)):
        bgradient+= (-2/N)*(datay[i]-((m_current*datax[i])+b_current))
        mgradient+= (-2/N)*datax[i]*(datay[i]-((m_current*datax[i])+b_current))
    newb=b_current-(bgradient*learningRate)
    newm=m_current-(mgradient*learningRate)
    return newm,newb
def basic_linear_regression(x, y):
    # Basic computations to save a little time.
    length = len(x)
    sum_x = sum(x)
    sum_y = sum(y)

    # sigma x^2, and sigma xy respectively.
    sum_x_squared = sum(map(lambda a: a * a, x))
    sum_of_products = sum([x[i] * y[i] for i in range(length)])

    # Magic formulae!  
    a = (sum_of_products - (sum_x * sum_y) / length) / (sum_x_squared - ((sum_x ** 2) / length))
    b = (sum_y - a * sum_x) / length
    return a, b

def error(m,b,datax,datay):
    error=0
    for i in range(0,len(datax)):
        error+=(datay[i]-(m*datax[i]+b))
    return error/len(datax)
def run():
    m=0
    b=0
    iterations=1000
    learningRate=.00001
    for i in range(0,iterations):
        m,b=gradient(b,m,learningRate)

    print(m,b)
    c,d=basic_linear_regression(datax,datay)
    print(c,d)
    gradientdescent=error(m,b,datax,datay)
    leastsquarederrors=error(c,d,datax,datay)
    print(gradientdescent)
    print(leastsquarederrors)
    plt.scatter(datax,datay)
    plt.plot([0,300],[b,300*m+b])
    plt.axis('equal')
    plt.show()

run() 

共有1个答案

宰父俊民
2023-03-14

我见过学习率有时在0.01的范围内。这可能是您需要1000多次迭代的原因,因为您的学习率是0.00001,除非您的数据集很小。学习速率越小,收敛所需的迭代就越多。

我注意到的另一件事是,您正在修复迭代次数。在第1000次迭代时,您永远无法判断成本函数是否将达到/接近全局最小值。尤其是在学习率如此之低的情况下,如果需要超过1000次迭代,该怎么办?为了解决这个问题-尝试使用while循环,在这个循环中,添加一个成本函数差(delta J)的计算,并保持循环直到(delta J

 类似资料:
  • 我试图在java中实现线性回归。我的假设是θ0θ1*x[i]。我试图计算θ0和θ1的值,使成本函数最小。我正在用梯度下降来找出值- 在 在收敛之前,这种重复是什么?我知道这是局部最小值,但我应该在while循环中输入的确切代码是什么? 我对机器学习非常陌生,刚开始编写基本的算法以获得更好的理解。任何帮助都将不胜感激。

  • 我试图在MatLab中实现一个函数,该函数使用牛顿法计算最佳线性回归。然而,我陷入了一个问题。我不知道如何求二阶导数。所以我不能实施它。这是我的密码。 谢谢你的帮助。 编辑:: 我用一些纸和笔解决了这个问题。你所需要的只是一些微积分和矩阵运算。我找到了二阶导数,它现在正在工作。我正在为感兴趣的人分享我的工作代码。

  • 我用JavaScript实现了一个非常简单的线性回归和梯度下降算法,但是在查阅了多个源代码并尝试了几件事情之后,我无法使它收敛。 数据是绝对线性的,只是数字0到30作为输入,x*3作为正确的输出来学习。 这就是梯度下降背后的逻辑: 我从不同的地方取了公式,包括: 乌达城深度学习基金会纳米学位的练习 吴恩达的线性回归梯度下降课程(也在这里) 斯坦福CS229讲义 我从卡内基梅隆大学找到的其他PDF幻

  • 我试图实现梯度下降的线性回归,如本文(https://towardsdatascience.com/linear-regression-using-gradient-descent-97a6c8700931)所述。我已经严格遵循了实现,但是经过几次迭代后,我的结果会溢出。我试图得到这个结果大约: y=-0.02x 8499.6。 代码: 在这里,它可以在围棋场上工作:https://play.go

  • 好的,那么这个算法到底意味着什么呢? 据我所知: i) 阿尔法:梯度下降的步骤有多大。 ii)现在,∑{hTheta[x(i)]-y(i)}:指给定θ值的总误差。 误差是指预测值{hTheta[x(i)]}与实际值之间的差值。[y(i)] σ{hTheta[x(i)]-y(i)}给出了所有训练示例中所有误差的总和。 结尾的Xj^(i)代表什么? 在为多元线性回归实现梯度下降时,我们是否在执行以下操

  • 在机器学习课程https://share.coursera.org/wiki/index.php/ML:Linear_Regression_with_Multiple_Variables#Gradient_Descent_for_Multiple_Variables中,它说梯度下降应该收敛。 我正在使用scikit学习的线性回归。它不提供梯度下降信息。我已经看到了许多关于stackoverflow