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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:47:07