You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单特征线性回归(梯度下降)参数更新方式差异及结果异常问询

单特征线性回归(梯度下降)参数更新的差异问题

你在实现单特征线性回归的梯度下降模型时,遇到了参数更新代码导致结果不同的问题:

原代码(结果不正确)

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,让它们保存当前迭代后的参数值,再将最终迭代结果赋值给实例变量。

导致结果不同的原因

梯度下降的核心逻辑是每一步都基于当前参数的梯度来更新参数,逐步逼近最优解:

  1. 第一种写法中,每次循环计算梯度时,使用的都是初始的m=5和b=0,因为局部变量m/b没有被修改。这意味着每次计算的梯度都是基于初始参数的,self.m/self.b每次都会被覆盖成初始参数的单次更新值,无法实现参数的累积迭代优化,最终参数无法收敛到最优值,导致绘图结果错误。
  2. 第二种写法中,每次循环先更新局部变量m/b,让它们成为当前迭代后的参数值。下一次计算梯度时,就会用这个更新后的参数来计算新的梯度,实现了参数的逐步迭代,最终能收敛到正确的线性回归参数,因此绘图结果正确。

内容的提问来源于stack exchange,提问作者Srivaths Gondi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:36:32