手动实现Linear Regression拟合线无法显示问题求助
手动实现线性回归拟合线不显示的问题解决
问题根源分析
- 变量映射颠倒:你将
x设为Salary(数值通常为几万级别),y设为YearsExperience(数值多在0-15区间),但后续生成拟合线的x_line范围是0-15,和Salary的实际范围完全不匹配,导致拟合线落在图表可视区域外,无法显示。 - 梯度下降导数计算错误:对参数
m和b的偏导数公式写反了。根据线性回归损失函数的推导,m的梯度(dm)应为(-2/n)*np.sum(x*(y-Y_hat)),b的梯度(db)应为(-2/n)*np.sum(y-Y_hat),错误的梯度计算会导致参数无法收敛到正确值。 - 学习率设置过高:
Learning_Rate = 0.01对于Salary这类大数值特征来说过大,会引发梯度下降发散,参数m和b变得异常,进一步让拟合线偏离可视范围。
修正后的代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') data = pd.read_csv(r'C:\Salary.csv') # 修正变量映射:用工作年限预测薪资,符合常规逻辑 x = data['YearsExperience'] y = data['Salary'] # 初始化参数 m = 0 b = 0 # 调整学习率到合适范围 Learning_Rate = 0.001 epochs = 5000 n = np.float(x.shape[0]) error = [] for i in range(epochs): Y_hat = m * x + b # 计算MSE mse = (1/n) * np.sum((y - Y_hat)**2) error.append(mse) # 修正梯度计算逻辑 dm = (-2/n) * np.sum(x * (y - Y_hat)) db = (-2/n) * np.sum(y - Y_hat) # 更新参数 m = m - Learning_Rate * dm b = b - Learning_Rate * db # 生成匹配实际特征范围的拟合线x轴数据 x_line = np.linspace(x.min(), x.max(), 100) y_line = m * x_line + b # 绘图 plt.figure(figsize=(8,6)) plt.title('Linear Regression Result') plt.plot(x_line, y_line, color='red', label='Fitted Line') plt.scatter(x, y, label='Data Points') plt.xlabel('Years of Experience') plt.ylabel('Salary') plt.legend() plt.show()
额外说明
- 修正变量映射后,拟合线的
x_line范围与实际特征范围一致,确保拟合线在图表可视区域内。 - 修正梯度计算后,参数能正确收敛到最优值,你可以观察
error列表的变化,确认损失函数持续下降,验证模型收敛状态。 - 降低学习率避免了梯度发散问题,保证参数更新过程稳定。
内容的提问来源于stack exchange,提问作者Walid
相关产品推荐
相关产品推荐

