基于Squared Loss实现Logistic Regression遇numpy.float64乘法报错如何解决
报错原因及修复方案
直接报错触发原因
你用Python原生列表和numpy.float64类型的浮点数做乘法运算触发了该错误:Python原生列表仅支持乘整数做重复操作,乘非整数的浮点数就会抛出这个异常。
代码存在的所有问题点
- 拼写错误:计算y_pred时把变量名
Function错写为Fucntion,会直接触发NameError - 函数传参错误:你定义的
F(W,X)是计算单条样本的线性加权结果,循环里却传入了整个X_train数据集列表,而非当前遍历的单条样本X_train[i] - 变量未初始化:学习率
L、权重m、偏置b三个变量没有提前定义初始值就直接参与更新运算 - 梯度计算逻辑错误:计算
Data_m和Data_b时没有引用当前循环的样本特征X_train[i]和标签Y_train[i],也没有对所有样本的梯度做聚合处理 - 系数维度匹配错误:你用sklearn初始化得到的
w是3维参数(因为输入X有3个特征),但后续更新参数却用了标量m和b,维度完全不匹配
修复后的参考代码
import numpy as np from sklearn.linear_model import LogisticRegression def logisticReg(data): # 转为numpy数组,避免原生列表运算限制 X_train = np.array([(d[0],d[1],d[2]) for d, _ in data]) Y_train = np.array([y for _, y in data]) n_samples, n_features = X_train.shape # 用sklearn结果初始化权重,也可自定义随机初始化 LogReg = LogisticRegression(random_state=42, solver='sag', penalty='none', max_iter=10000, fit_intercept=False) LogReg.fit(X_train, Y_train) w = LogReg.coef_[0].copy() L = 0.001 # 手动设置学习率 epochs = 100 # 设置训练轮次 sigmoid = lambda y: 1/(1+np.exp(-y)) # 批量梯度下降迭代 for epoch in range(epochs): y_pred = sigmoid(np.dot(X_train, w)) # 平方损失梯度计算 grad = 2 * np.dot(X_train.T, (y_pred - Y_train)) / n_samples w = w - L * grad print("训练得到的权重:", np.round(w,2)) data = [((1, 0, 0), 1), ((1, 1, 7), 0), ((1, -3, -2), 0), ((1, 8, 9), 1), ((1, 4, 3), 1), ((1, 5, -2), 1), ((1, 0, 0), 1), ((1, 6, 9), 1), ((1, 4, 2), 1), ((1, 1, -9), 1), ((1, -7, 7), 0), ((1, 0, -1), 1), ((1, 9, -4), 1), ((1, 1, 0), 1), ((1, -2, -5), 1), ((1, 2, 3), 1), ((1, -7, 2), 0), ((1, -3, 0), 0), ((1, 5, 0), 1), ((1, 0, -3), 1), ((1, -2, 3), 0), ((1, 9, 6), 1), ((1, 0, -8), 1), ((1, 0, 2), 0), ((1, -8, 6), 0), ((1, 1, 9), 0), ((1, 0, 5), 0), ((1, -4, 9), 0), ((1, 8, 2), 1), ((1, 2, 6), 0)] logisticReg(data)
内容的提问来源于stack exchange,提问作者tquigg96
相关产品推荐
相关产品推荐

