手动实现Logistic Regression遇维度不匹配ValueError求助
Logistic Regression维度不匹配问题修复
核心错误点
- 权重初始化错误:权重维度应与特征数一致,而非样本数。你的单个样本有4个特征,权重
weights应初始化为(4,1),而非(87,1)。 - 线性组合计算错误:原代码
np.dot(x_train.T,weights)维度不匹配,正确计算应为np.dot(x_train, weights),让样本矩阵(87,4)与权重矩阵(4,1)做内积,得到对应每个样本的预测值(87,1)。 - 梯度dw计算错误:原代码
np.dot((A-y_train),x_train.T)维度不兼容,正确写法是np.dot(x_train.T, (A-y_train)),通过特征矩阵转置(4,87)与误差矩阵(87,1)内积,得到与权重同维度的梯度(4,1)。 - loss列表初始化位置错误:循环内重复创建空列表会导致最终仅保留最后一次损失值,需将
loss = []移至循环外。 - 函数调用拼写错误:
logisitic_regression应为logistic_regression。
修正后的代码
import numpy as np def logistic_regression(x_train, y_train, learning_rate, iterations): m = len(x_train) n = len(x_train[0]) # 权重初始化为特征数维度 weights = np.zeros((n, 1)) b = 0 # loss列表移至循环外 loss = [] for i in range(iterations): # 正确计算线性组合z z = np.dot(x_train, weights) + b A = 1 / (1 + np.exp(-z)) cost = (-1/m) * np.sum(y_train * np.log(A) + (1 - y_train) * np.log(1 - A)) # 正确计算梯度dw dw = (1/m) * np.dot(x_train.T, (A - y_train)) db = (1/m) * np.sum(A - y_train) # 权重更新无需转置 weights = weights - learning_rate * dw b = b - learning_rate * db loss.append(cost) if (i % (iterations // 10) == 0): print("Cost after iteration %i: %f" % (i, cost)) return weights, b, loss iterations = 1000 learning_rate = 1e-3 # 修正函数名拼写 w, b, loss = logistic_regression(np.array(x_train), np.array(y_train), learning_rate, iterations)
内容的提问来源于stack exchange,提问作者daylightisminetocommand
相关产品推荐
相关产品推荐

