简易线性回归模型参数计算异常,求排查错误原因
线性回归模型调试问题解答
先纠正一个小细节:摄氏度转华氏度的正确公式是 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
相关产品推荐
相关产品推荐

