【问题标题】:Y intercept not changing in linear regression gradient descentY 截距在线性回归梯度下降中没有变化
【发布时间】:2018-02-21 13:23:39
【问题描述】:

我目前正在学习梯度下降,所以我编写了一段代码,它使用梯度下降和线性回归。然而,我得到的线路并不是最好的线路。我计算了梯度下降线性回归和最小二乘误差回归的误差。无论我使用什么数据,最小二乘误差总是给我一个低得多的误差。我决定查看斜率和 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() 

【问题讨论】:

    标签: machine-learning linear-regression gradient-descent


    【解决方案1】:

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

    我注意到的另一件事是您正在修复迭代次数。您永远无法判断您的成本函数是否会在第 1000 次迭代时达到/接近全局最小值。尤其是在学习率这么低的情况下,如果你需要超过 1000 次迭代怎么办?为了解决这个问题 - 尝试使用 while 循环并在此循环内,添加成本函数差异的计算(delta J)并继续循环直到(delta J < Threshold),其中阈值通常保持非常低(在 0.01 或 0.001 的范围内)。然后在退出 while 循环后获取成本函数,并将其与从 OLS 方法获得的值进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 2021-06-24
      • 2017-06-20
      • 2019-10-09
      • 1970-01-01
      相关资源
      最近更新 更多