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

线性回归代价函数为何呈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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:33:26