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
相关产品推荐
相关产品推荐

