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

简易线性回归模型参数计算异常,求排查错误原因

线性回归模型调试问题解答

先纠正一个小细节:摄氏度转华氏度的正确公式是 F = 1.8*C + 32,对应线性模型 y = m*x + b,应该是 m=1.8,b=32,你写反了这两个值。

代码中的核心错误

  • 模型公式与梯度计算完全错误
    你把线性模型写成了 y = m + b*x,但正确的应该是 y = m*x + b。对应均方误差损失的梯度计算,单个样本对m和b的偏导应该是:

    • 对m的偏导:2*(m*x_i + b - y_i)*x_i
    • 对b的偏导:2*(m*x_i + b - y_i)
      你的代码里不仅搞反了模型的变量顺序,梯度计算逻辑也完全偏离了正确的偏导公式。
  • 梯度未在每个epoch重置
    每次外层循环(epoch)开始时,没有把m_gradient和b_gradient重置为0,导致梯度在所有epoch中持续累加,最终梯度值完全失真。

  • 权重更新逻辑错误
    你把权重更新放在了外层循环外面,意味着只有最后一次epoch计算的梯度会被用来更新权重,前面9999次循环的计算全部无效。而且更新后没有把新权重赋值给m和b,下一次循环还是用初始的m=100、b=0计算。

修正后的代码

import numpy as np

celsius_q = np.array([-40, -10, 0, 8, 15, 22, 38], dtype=float)
fahrenheit_a = np.array([-40, 14, 32, 46, 59, 72, 100], dtype=float)

inputs = celsius_q
output_expected = fahrenheit_a

# 正确模型:y = m*x + b,对应F=1.8*C+32
m = 0.0  # 初始值设为接近真实值的数,收敛更快
b = 0.0
learning_rate = 0.001  # 调整为更合适的学习率
epochs = 10000

for _ in range(epochs):
    m_gradient = 0.0
    b_gradient = 0.0
    n = len(inputs)
    
    for x, y in zip(inputs, output_expected):
        pred = m * x + b
        # 计算梯度(均方误差的偏导)
        m_gradient += (pred - y) * x
        b_gradient += (pred - y)
    
    # 更新权重
    m -= learning_rate * (2 / n) * m_gradient
    b -= learning_rate * (2 / n) * b_gradient

print(f"训练后的m: {m:.2f}, b: {b:.2f}")

运行这段代码后,最终会得到接近m=1.8、b=32的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:40:49