基于Numpy与线性代数实现向量化线性回归遇ValueError求助
解决线性回归代码中的ValueError问题
我来帮你排查这个代码里的问题,核心原因是矩阵维度不匹配,导致在权重更新步骤无法进行元素级运算。咱们一步步拆解问题并修正:
问题根源分析
先看代码里的关键维度:
- 你的输入
x是(2,3)(2个样本,每个样本3个特征),y是(2,)(对应2个样本的标签) - 权重
w是(1,3)的行向量 - 在循环中,你计算
h_of_x = linear_function(w, xT, 1),这里xT是x.T即(3,2),np.dot(w, xT)得到的是(1,2)的行向量(对应2个样本的预测值) - 然后
loss = h_of_x - yT,yT是y.T还是(2,)的一维数组,numpy会广播成(1,2),这一步暂时没问题,但接下来的权重更新就出问题了:- 你试图用
w = w + np.multiply(-learning_rate, loss),但w是(1,3),loss是(1,2),两个数组形状完全不匹配,numpy无法执行元素级乘法和加法,直接触发ValueError。
- 你试图用
另外,你的梯度更新逻辑也不对——线性回归的权重更新需要结合输入特征计算梯度,而不是直接用损失值去更新权重。
修正后的代码
我调整了维度匹配问题和梯度计算逻辑,同时保留你用numpy实现的核心思路:
import numpy as np def linear_function(w, x, b): # x是(样本数, 特征数),w是(特征数, 1),这样x@w得到(样本数,1)的预测值 return np.dot(x, w) + b # 输入数据:2个样本,每个3个特征 x = np.array([[1, 1, 1],[0, 0, 0]]) # 标签转成(2,1)的列向量,和预测值维度匹配 y = np.array([[0],[1]]) # 权重设为(3,1)的列向量,对应3个特征 w = np.random.uniform(-1, 1, (3, 1)) b = 1 # 单独把偏置拿出来,方便后续更新 learning_rate = 0.01 # 调大学习率,让收敛更快 m = x.shape[0] # 样本数 for i in range(30000): h_of_x = linear_function(w, x, b) loss = h_of_x - y if i % 10000 == 0: # 打印当前的损失平方和,方便看收敛情况 print(f"迭代次数{i},损失平方和:{np.sum(loss**2)},权重:{w.T}") # 计算权重和偏置的梯度 dw = (1/m) * np.dot(x.T, loss) db = (1/m) * np.sum(loss) # 更新权重和偏置 w = w - learning_rate * dw b = b - learning_rate * db # 测试预测结果 predictions = linear_function(w, x, b) print("最终预测结果:", predictions)
关键修正点
- 维度统一:把
y转成列向量,w设为列向量,确保预测值h_of_x和标签y维度完全匹配 - 正确计算梯度:根据线性回归的MSE损失梯度公式,
dw = (1/m) * X.T @ (h - y),db = (1/m) * sum(h - y),这样梯度的形状和w、b完全匹配,更新时不会出错 - 调整学习率:原来的
0.0001太小,收敛速度极慢,改成0.01能更快看到效果
运行效果
现在代码可以正常运行,迭代过程中会打印损失值的变化,最终预测结果会接近真实标签[0,1]。
内容的提问来源于stack exchange,提问作者blue-sky
相关产品推荐
相关产品推荐

