线性回归代价函数为何呈U形而非碗状?如何优化3D可视化?
问题解答
为什么代价函数呈现拉伸谷状?
这是正常现象,并非绘图代码错误。单特征线性回归的代价函数本质是关于w和b的二次函数,其形状由特征x的尺度直接决定:
- 若特征x的数值较大(或与常数项的尺度差异明显),w的微小变化会导致预测值
wx+b发生显著改变,代价函数对w的变化更敏感,表现为w方向的曲率更大; - 而b是常数项,其变化对预测值的影响不受x尺度放大,代价函数对b的敏感度极低,因此b方向的曲率极小,最终呈现沿w方向弯曲、b方向平坦的拉伸谷状。
优化3D可视化的方法
1. 对特征x做标准化处理
在训练前对特征x进行Z-score标准化(减去均值,除以标准差),让x的尺度与常数项b的尺度对齐。这样代价函数对w和b的敏感度会趋于一致,曲面会更接近对称的碗状。
示例代码(添加到数据加载后):
bigdata['X'] = (bigdata['X'] - bigdata['X'].mean()) / bigdata['X'].std()
注意:标准化后训练得到的w和b需要反向转换才能适配原尺度的x,转换公式为:
- 原尺度的w' = w / x_std
- 原尺度的b' = b - (w * x_mean)/x_std
2. 调整绘图坐标轴的缩放比例
在Plotly中强制让w和b的坐标轴使用等比例缩放,缩小视觉上的拉伸感:
修改绘图代码的fig.show()前部分:
fig.update_layout( scene=dict( aspectmode='manual', aspectratio=dict(x=1, y=1, z=0.5) # 自定义w、b、cost三个轴的比例 ) ) fig.show()
也可以让系统自动适配数据比例:
fig.update_layout(scene=dict(aspectmode='data')) fig.show()
3. 扩大b的取值范围
如果不想修改数据,可尝试扩大b的取值范围,让b方向的代价函数变化更明显。比如把b_data = np.linspace(-10, 10, 100),这样能直观看到b方向的曲率,不过这只是视觉调整,不会改变代价函数的本质形状。
代码正确性验证
你的代价函数和梯度下降实现逻辑完全正确:
calc_cost_function正确计算了均方误差的一半,符合线性回归的损失定义;gradient_descent中w和b的梯度推导准确,迭代更新逻辑无误,最终得到的w≈3.93、b≈0.41是合理的拟合结果。
内容的提问来源于stack exchange,提问作者Aditya Verma
相关产品推荐
相关产品推荐

