单特征线性回归(梯度下降)参数更新方式差异及结果异常问询
单特征线性回归(梯度下降)参数更新的差异问题
你在实现单特征线性回归的梯度下降模型时,遇到了参数更新代码导致结果不同的问题:
原代码(结果不正确)
import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model class gradientdescent: def fit(self,X,Y): lr=0.01 m=5 b=0 m_gradient=0 for _ in range(1000): m_gradient= (lr*(np.sum((m*X+b-Y)*X))/(np.size(X))) b_gradient= (lr*(np.sum(m*X+b-Y))/(np.size(X))) self.m=m-m_gradient # 此处导致结果异常 self.b=b-b_gradient # 此处导致结果异常 def predict(self,X): return self.m*X+self.b X=np.array([1,2,3,4,5,6,7,8]) Y=np.array([1,2,4,4,5,7,8,8]) clf=gradientdescent() clf.fit(X,Y) plt.scatter(X,Y, color='black') plt.plot(X, clf.predict(X))
修改后的参数更新代码(结果正确)
将原代码中的:
self.m=m-m_gradient self.b=b-b_gradient
替换为:
m=m-m_gradient b=b-b_gradient self.b=b self.m=m
两种写法的差异及原因
差异核心
- 第一种写法:直接用**初始局部变量
m/b**计算并赋值给实例变量self.m/self.b,但局部变量m/b从未被更新,始终保持初始值m=5、b=0。 - 第二种写法:先更新局部变量
m/b,让它们保存当前迭代后的参数值,再将最终迭代结果赋值给实例变量。
导致结果不同的原因
梯度下降的核心逻辑是每一步都基于当前参数的梯度来更新参数,逐步逼近最优解:
- 第一种写法中,每次循环计算梯度时,使用的都是初始的
m=5和b=0,因为局部变量m/b没有被修改。这意味着每次计算的梯度都是基于初始参数的,self.m/self.b每次都会被覆盖成初始参数的单次更新值,无法实现参数的累积迭代优化,最终参数无法收敛到最优值,导致绘图结果错误。 - 第二种写法中,每次循环先更新局部变量
m/b,让它们成为当前迭代后的参数值。下一次计算梯度时,就会用这个更新后的参数来计算新的梯度,实现了参数的逐步迭代,最终能收敛到正确的线性回归参数,因此绘图结果正确。
内容的提问来源于stack exchange,提问作者Srivaths Gondi
相关产品推荐
相关产品推荐

