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”,大概率是因为:
- 调用函数时传了原始
X(2维),但误打印了X1的行; - Numpy一维数组
(3,)的显示容易混淆,转成列向量reshape(-1,1)后维度就明确了,能避免这类迷惑性问题。
内容的提问来源于stack exchange,提问作者Jerry Qu
相关产品推荐
相关产品推荐

