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

手动实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:10:21