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

从零实现Logistic Regression:预测始终错误,梯度更新符号存疑

Logistic回归实现错误排查:梯度更新符号问题

我从零实现了Logistic Regression,但运行脚本时算法始终预测错误标签。我尝试将训练输出和测试输出的1与0互换,结果依然预测错误;但将权重和偏置更新时的减号改为加号后,脚本就能正确预测标签。请问我哪里出错了?

以下是我编写的代码:

# IMPORTS
import numpy as np

# HYPERPARAMETERS
EPOCHS = 1000
LEARNING_RATE = 0.1

# FUNCTIONS
def sigmoid(z):
    return 1 / (1 + np.exp(-z))


def cost(y_pred, training_outputs, m):
    j = - np.sum(training_outputs * np.log(y_pred) + (1 - training_outputs) * np.log(1 - y_pred)) / m
    return j


# ENTRY
if __name__ == "__main__":
    
    # Training input and output
    x = np.array([[1, 1, 1], [0, 0, 0], [1, 0, 1]])
    training_outputs = np.array([1, 0, 1])

    # Test input and output
    test_input = np.array([[0, 1, 1]])
    test_output = np.array([0])

    # Weigths
    w = np.array([0.3, 0.3, 0.3])

    # Biases
    b = 0

    m = 3

    # Training
    for iteration in range(EPOCHS):
        print("Iteration n.", iteration, end= "\r")
        
        # Compute log odds
        z = np.dot(x, w) + b

        # Compute predicted probability
        y_pred = sigmoid(z)

        # Back propagation
        dz = y_pred - training_outputs
        dw = np.dot(x, dz) / m
        db = np.sum(dz) / m

        # Update weights and bias according to the gradient descent algorithm
        w = w - LEARNING_RATE * dw
        b = b - LEARNING_RATE * db

    print("Model trained. Proceeding with model evaluation...")

    # Test
    # Compute log odds
    z = np.dot(test_input, w) + b

    # Compute predicted probability
    y_pred = sigmoid(z)
    print(y_pred)
    
    # Compute cost
    cost = cost(y_pred, test_output, m)

    print(cost)

问题根源

核心错误出在梯度计算时的矩阵转置缺失,导致梯度方向完全颠倒:

在逻辑回归的反向传播中,权重梯度dw的正确计算方式是特征矩阵的转置与误差向量dz的点积,再除以样本数m。你当前的代码中直接用原始特征矩阵x和dz做点积,得到的是错误的梯度方向——相当于每次更新都在往损失函数上升的方向走,自然无法收敛到正确结果。而你把更新公式的减号改成加号,相当于反向执行了错误的梯度,反而歪打正着走到了损失下降的方向,所以能得到正确预测,但这是错误的解决方式。

修复方案

将梯度计算中的np.dot(x, dz)修改为np.dot(x.T, dz),保持原有的权重更新公式不变即可:

# Back propagation
dz = y_pred - training_outputs
dw = np.dot(x.T, dz) / m  # 补充特征矩阵的转置x.T
db = np.sum(dz) / m

# 保持原更新公式不变,无需修改符号
w = w - LEARNING_RATE * dw
b = b - LEARNING_RATE * db

补充说明

  1. 训练数据的规律:特征全为1→标签1,全为0→标签0,第1、3特征为1→标签1,测试样本[0,1,1]不符合这些规律,标签应为0,修复后的模型能正确学到这个逻辑。
  2. 可在训练循环中加入损失值打印,观察损失是否持续下降,验证模型收敛情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:20:14