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

Numpy矩阵行X[i]维度识别异常导致矩阵乘法维度不匹配求助

问题分析与修正方案

核心错误点

  • 传参错误:你计算权重W用的是加了偏置项的X1(100×3),但调用costFunction1时如果传入的是原始X(100×2),X[i]是2维向量,和3维的W做乘法必然维度不匹配,必须传X1。
  • 梯度/海森矩阵维度定义错误:
    • 梯度grad应该和W同维度(3维),你初始化的(1, 100)完全不符合参数梯度的逻辑,后续赋值必然维度冲突。
    • 海森矩阵hess是对参数W的二阶导,维度应为(3,3),而非(100,100),当前的赋值逻辑完全错误。
  • 语法错误:W.transpose@X[i]少了调用括号,应为W.transpose()@X[i],不过一维数组转置意义不大,直接用W @ X[i]更简洁。

修正后的代码

# Load data set 
import pandas as pd
import numpy as np
from numpy import linalg as LA

df=pd.read_csv("ex2data1.txt",header=None)
X=df.iloc[:,:-1].values
y=df.iloc[:,-1].values   
y=2*y-1 # 把0/1转成-1/1

# 创建带偏置项的X矩阵
X0 = np.ones((len(X),1))
X1 = np.hstack((X,X0))

W = y@LA.pinv(X1.transpose())

# 修正后的代价函数
def costFunction1(W, X, y):
    """
    输入numpy数组W, X, y,返回代价、梯度和海森矩阵
    """
    cost = 0.0
    grad = np.zeros_like(W)  # 梯度维度和W一致
    hess = np.zeros((len(W), len(W)))  # 海森矩阵维度为参数维度的平方
    
    for i in range(len(y)):
        xi = X[i].reshape(-1, 1)  # 转成3×1列向量,明确维度
        wx = W @ xi  # 计算W·xi,结果是标量(用.item()取出)
        term = 1 - y[i] * wx.item()
        
        cost += term ** 2
        
        # 更新梯度:列向量累加
        grad += xi * (wx.item() - y[i])
        # 更新海森矩阵:3×3矩阵累加
        hess += xi @ xi.T
    
    return cost , grad, hess

# 调用时必须传入X1,而非原始X
cost, grad, hess = costFunction1(W, X1, y)

补充说明

你提到的“打印X[i]是3x1但报错说3x0”,大概率是因为:

  1. 调用函数时传了原始X(2维),但误打印了X1的行;
  2. Numpy一维数组(3,)的显示容易混淆,转成列向量reshape(-1,1)后维度就明确了,能避免这类迷惑性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:31:12