矩阵形式线性回归梯度下降不同初始参数得到不同最终theta问题排查
问题原因
- 迭代未收敛:你设置的损失阈值
epsilon=0.1远低于该任务下能达到的最小MSE(该数据集线性回归最优MSE约为1.0),所以所有训练都会跑满max_iterations=1000次就停止,并未收敛到全局最优点。同时学习率0.0001太小,1000次迭代的更新步长不足以让不同初始值的参数都走到最优区域,自然结果差异大。你可以打印梯度下降返回的第二个布尔值,所有场景下都会返回False,证明都跑满了1000次迭代,并未触发损失阈值停止条件,属于未收敛状态。 - 梯度计算维度匹配问题:你当前的梯度计算逻辑在
theta和y_obs为一维数组时,会出现隐式转置导致的计算偏差,标准MSE梯度计算应为:
def gradient_of_loss(theta, X, y_obs): n = len(y_obs) y_hat = X @ theta return 1.0/n * X.T @ (y_hat - y_obs)
- 特征尺度未统一:输入特征
total_bill取值范围为3~50,而bias恒为1,特征尺度差异过大会大幅降低梯度下降的收敛速度,需要更多迭代次数才能收敛。
修正方案
- 调整停止条件:将
epsilon调大到1.05,或者把判断条件改为两次迭代的损失差值小于epsilon,避免用绝对损失值判断收敛 - 调大学习率到0.001,同时把最大迭代次数提升到1e5级别
- 对
total_bill做标准化处理,加快收敛 - 修正梯度计算逻辑
修正后用不同初始值训练,最终得到的theta会和解析解[0.105, 0.920]基本一致。
内容的提问来源于stack exchange,提问作者Chloe
相关产品推荐
相关产品推荐

