【问题标题】:Gradient Descent for multivariate Regression value not converging多元回归值的梯度下降不收敛
【发布时间】:2019-01-24 18:07:20
【问题描述】:

我已经尝试使用多变量回归的这段代码来查找系数,但找不到我犯错的地方或者我是否走在正确的道路上? 问题是 mse 值没有收敛。

这里 x1 , x2 , x3 是我拥有的 3 个特征变量(我已将每个特征列切成这些 x1 , x2 ,x3 变量)

def gradientDescent(x,y):
   mCurrent1=mCurrent2=mCurrent3=bCurrent=0
   iteration=1000
   learningRate=0.0000001
   n=len(x)


   for i in range(0,iteration):
       y_predict=mCurrent1*x1+mCurrent2*x2+mCurrent3*x3+bCurrent
       mse=(1/n)*np.sum([val**2 for val in (y-y_predict)])


       mPartDerivative1=-(2/n)*np.sum(x1*(y-y_predict))
       mPartDerivative2=-(2/n)*np.sum(x2*(y-y_predict))
       mPartDerivative3=-(2/n)*np.sum(x3*(y-y_predict))

       bPartDerivative=-(2/n)*np.sum(y-y_predict)

       mCurrent1=mCurrent1-(learningRate*mPartDerivative1)
       mCurrent2=mCurrent2-(learningRate*mPartDerivative2)
       mCurrent3=mCurrent3-(learningRate*mPartDerivative3)

       bCurrent=bCurrent-(learningRate*bPartDerivative)
       print('m1:{} m2:{} m3:{} b:{} iter:{} mse:{}'.format(mCurrent1,mCurrent2,mCurrent3,bCurrent,i,mse))

    return(round(mCurrent1,3),round(mCurrent2,3),round(mCurrent3,3),round(bCurrent,3))

【问题讨论】:

  • 因为 mse 正在减少。如果您以更大的学习率进行更多迭代,这将收敛。如果您的数据嘈杂,您可以拥有较高的 MSE,但这不是收敛问题。

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


【解决方案1】:

看起来你的程序应该可以工作。但是,您的学习率可能太小。请记住,学习率是您降低成本函数的步长。如果学习率太小,它会在成本曲线上移动太慢,并且需要很长时间才能达到收敛(需要很大的迭代次数)。但是,如果学习率太大,就会出现发散问题。选择正确的学习率和迭代次数(换句话说,调整你的超参数)更像是一门艺术而不是一门科学。您应该使用不同的学习率。

我创建了自己的数据集和随机生成的数据((m1, m2, m3, b) = (10, 5, 4, 2))并运行了您的代码:

import pandas as pd
import numpy as np

x1 = np.random.rand(100,1)
x2 = np.random.rand(100,1)
x3 = np.random.rand(100,1)
y = 2 + 10 * x1 + 5 * x2 + 4 * x3 + 2 * np.random.randn(100,1)
df = pd.DataFrame(np.c_[y,x1,x2,x3],columns=['y','x1','x2','x3'])

#df.head()
#            y        x1        x2        x3
# 0  11.970573  0.785165  0.012989  0.634274
# 1  19.980349  0.919672  0.971063  0.752341
# 2   2.884538  0.170164  0.991058  0.003270
# 3   8.437686  0.474261  0.326746  0.653011
# 4  14.026173  0.509091  0.921010  0.375524

0.0000001 的学习率运行您的算法会产生以下结果:

(m1, m2, m3, b) = (0.001, 0.001, 0.001, 0.002)

.1 的学习率运行您的算法会产生以下结果:

(m1, m2, m3, b) = (9.382, 4.841, 4.117, 2.485)

请注意,当学习率为 0.0000001 时,您的系数与它们开始的位置 (0) 相差不大。就像我之前说的那样,小的学习率使得我们改变系数的速度太小了,因为我们正在以超小的步长向下移动成本函数。

我添加了一张图片来帮助可视化选择步长。请注意,第一张图片使用了较小的学习率,而第二张图片使用了较大的学习率。

小学习率:

大学习率:

【讨论】:

  • 我已经尝试使用 0.0000001 的学习率,其中大约需要超过 10000 次迭代仍未收敛,并且当尝试使用 0.00001 时,mse 达到无限。算法好还是需要一些修改
  • 您能否将迭代次数设置为 10 并显示运行程序时打印的内容?
  • 或者,如果我使用 10000 次迭代,学习率为 0.00000016,我的 r 分数为 0.61
  • 抱歉,我的意思是你能编辑你的答案以显示前 10 次迭代打印吗?
  • 我已经在问题本身中发布了。看看
猜你喜欢
  • 2017-08-09
  • 2020-10-10
  • 2015-02-18
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 2013-06-21
相关资源
最近更新 更多