我尝试了这段多元回归的代码来寻找系数,但是找不到我犯了什么错误,或者我是否在正确的道路上? 问题是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))
看来你的程序应该可以用了。但是,你的学习速度可能太慢了。记住,学习率是你降低成本函数的步骤的大小。如果一个学习速率太小,那么它在成本曲线上的下移速度就会太慢,并且需要很长时间才能达到收敛(需要大量的迭代次数)。然而,如果学习率太大,那么你就有分歧的问题。选择正确的学习速率和迭代次数(换句话说,调整超参数)与其说是一门科学,不如说是一门艺术。你应该以不同的学习速度来玩。你知道吗
我创建了自己的数据集和随机生成的数据(其中
(m1, m2, m3, b) = (10, 5, 4, 2)
),并运行了您的代码:以
0.0000001
的学习率运行算法会产生以下结果:以
.1
的学习率运行算法会产生以下结果:请注意,当学习速率为
0.0000001
时,系数与它们开始的位置没有太大差异(0
)。就像我前面说的,学习速率很小,所以我们改变系数的速率太小,因为我们在超小的步长下移动成本函数。你知道吗我已经添加了一个图片,以帮助可视化选择一个步骤的大小。请注意,第一张图片使用较小的学习速率,第二张图片使用较大的学习速率。你知道吗
学习率低:
学习率高:
相关问题 更多 >
编程相关推荐