为了账号安全,请及时绑定邮箱和手机立即绑定

多元回归值的梯度下降不收敛

多元回归值的梯度下降不收敛

宝慕林4294392 2021-10-19 17:13:42
我已经尝试了这段用于多变量回归的代码来查找系数,但找不到我犯错的地方或者我是否在正确的道路上?问题是 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))
查看完整描述

1 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

看起来你的程序应该可以工作。但是,您的学习率可能太小了。请记住,学习率是您减少成本函数的步骤的大小。如果一个学习率太小,它会沿着成本曲线的下移太慢,并且需要很长时间才能达到收敛(需要很大的迭代次数)。但是,如果学习率太大,那么就会出现发散的问题。选择正确的学习率和迭代次数(换句话说,调整超参数)与其说是科学,不如说是一门艺术。你应该尝试不同的学习率。


我创建了自己的数据集和随机生成的数据(其中(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)没有太大区别。就像我之前说的,小学习率使它成为这样,所以我们以太小的速率改变系数,因为我们以超小步长向下移动成本函数。


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


小学习率:

//img1.sycdn.imooc.com//616e8c6e00010ab106410506.jpg

大学习率:

//img1.sycdn.imooc.com//616e8c7f000102a206060421.jpg

查看完整回答
反对 回复 2021-10-19
  • 1 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号