多自变量回归直线求解方法及Python多元线性回归实现正确性咨询
代码问题逐点拆解
1. 回归系数计算环节判断
- 求解的核心逻辑是正确的:通过构造带截距项的设计矩阵,用
np.linalg.lstsq做最小二乘求解,完全符合多元线性回归的正规方程求解流程 - 存在一个完全多余、且会导致结果错位的错误操作:
你对lstsq返回的系数做逆序是毫无必要的。构造设计矩阵时列的顺序是[全1截距列、Weight特征列、Volume特征列],所以lstsq返回的系数顺序天然是[截距项b0、Weight的系数b1、Volume的系数b2]。逆序之后系数和对应特征完全错配,算出来的关系完全不符合真实模型。
按你的数据集跑出来的真实原系数为b0≈79.69, b1≈0.00755, b2≈0.00781,逆序之后会变成[0.00781, 0.00755, 79.69],数值和特征的对应关系全乱。
2. 回归模型搭建环节判断
- 搭建逻辑完全错误:双自变量的多元线性回归在3D空间中对应一个平面,而非一条直线。
你当前的代码是把两个特征轴分别乘上系数,生成两条独立的一维序列再求和加常数,本质是画了一条脱离平面逻辑的斜线,完全不是正确的拟合面。就算去掉之前的系数逆序错误,这种一维逐点生成的方式也无法覆盖两个特征联动的平面关系。
3. 绘图环节判断
- 原始样本的散点绘制逻辑是正确的:将原始数据的Weight、Volume、CO2三维值绘制成3D散点,颜色映射的实现没有问题
- 拟合结果的绘制逻辑存在两处核心错误:
- 取的特征范围完全脱离实际:代码里x1、y1的取值范围是0到120,但你的数据集中Weight实际范围是7901746,Volume实际范围是9002500,画出来的拟合线和真实样本区域完全分离
- 形式错误:双特征回归的拟合结果是平面,不存在单一的"拟合直线",正确的绘制需要覆盖两个特征的全取值范围生成网格,映射到预测值上形成半透明的拟合平面。
修正后的核心实现片段:
# 直接取lstsq返回的系数,删掉多余的逆序操作 b0, b_weight, b_volume = np.linalg.lstsq(A, Y, rcond=None)[0] # 基于真实数据的取值范围生成特征网格 w_mesh, v_mesh = np.meshgrid( np.linspace(x_cars_weight.min(), x_cars_weight.max(), 30), np.linspace(x_cars_volume.min(), x_cars_volume.max(), 30) ) # 代入回归方程计算网格点上的CO2预测值 co2_grid = b0 + b_weight * w_mesh + b_volume * v_mesh # 绘制半透明的回归平面 ax.plot_surface(w_mesh, v_mesh, co2_grid, color='gray', alpha=0.5)
内容的提问来源于stack exchange,提问作者user12625850
相关产品推荐
相关产品推荐

