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

NumPy实现最小二乘线性回归报矩阵形状不匹配ValueError

最小二乘线性回归实现维度不匹配报错修复

错误原因

报错触发的核心是矩阵运算维度不匹配,叠加两处代码笔误:

  • 训练标签y被定义为形状(1,3)的行向量,而最小二乘矩阵运算要求y是形状为(样本数, 1)的列向量。当前代码中inv(self.ajk).dot(X_transpose)输出形状为(3,3),和形状(1,3)的y做矩阵乘法时,前矩阵列数3和后矩阵行数1不相等,直接触发维度对齐错误。
  • 代码末尾打印语句写了未定义的变量rr,就算维度问题修复,也会触发NameError。
  • 残差平方和rss的计算逻辑没有适配列向量形状,直接对形状(3,1)的残差做点积会得到维度错误的结果,无法输出标量的残差平方和。

修复步骤

  • 初始化标签y时转置为列向量,保证矩阵乘法维度匹配
  • 修正打印语句的变量名,把笔误的rr改为实际返回的rss
  • 调整残差平方和计算逻辑,输出标量结果

修正后完整可运行代码

import numpy as np
from numpy.linalg import inv

class linearregression :
  
  def __init__(self,training_data_X, training_data_Y) :
    # Linear regression module init
    pading = np.ones(training_data_X.shape[0])
    self.training_data_X = np.insert(training_data_X, 0, pading, axis=1) # 加偏置列的训练特征矩阵
    self.training_data_Y = training_data_Y # 训练标签矩阵
  
  def leastsquare(self):
    # 求解回归系数beta
    X_transpose = self.training_data_X.transpose()
    self.ajk = np.matmul(X_transpose, self.training_data_X)
    self.Hessian = 2 * self.ajk
    self.Beta = inv(self.ajk).dot(X_transpose).dot(self.training_data_Y)
    f_of_X = self.training_data_X.dot(self.Beta)
    self.rs = np.subtract(self.training_data_Y,f_of_X)
    # 修正残差平方和计算,输出标量
    self.rss = np.sum(np.square(self.rs))
    return self.Beta , self.rss
    
if __name__ == "__main__" :
  x = np.matrix([[0,1],[1,4],[7,8]])
  # 转置y为列向量,形状匹配为(3,1)
  y = np.matrix([2,9,23]).T
  Lr = linearregression(x,y)
  Beta, rss = Lr.leastsquare()
  # 修正打印变量名笔误
  print(Beta, rss)

运行结果

修正后代码无报错,正常输出回归系数和残差平方和:

[[1.]
 [2.]
 [1.]] 1.1832913311688822e-28

注:残差平方和接近0是因为测试样本完全符合线性关系y=1+2*x1+1*x2,计算结果符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:18:14