很多人第一次看到「逻辑回归(Logistic Regression)」都会愣一下:名字里带「回归」,干的却是分类的活。这其实是机器学习里最经典的「名不副实」——它本质是一个概率二分类模型。这篇文章顺着「为什么、是什么、怎么训练」的脉络,把 sigmoid、决策边界、交叉熵和梯度下降一次讲透,并附上完整的 C++ 实现。(我不慌—成长杂货铺,https://wobuhuang.com)

一、问题设定:不硬分,而是输出概率
给定两类点,我们想学一条边界把它们分开。但逻辑回归不做「非黑即白」的硬分类,而是输出「某个样本属于正类的概率」(0~1)。做法是:先算一个线性打分 z = w·x + b,再用 sigmoid 把这个打分压成概率。
二、sigmoid:把线性打分变成概率
sigmoid 函数把任意实数压到 (0,1) 区间:
p = 1 / (1 + e^(-z))
直觉非常清晰:z 很大 → p≈1(很确定是正类);z 很小 → p≈0(很确定是负类);z=0 → p=0.5(恰好在边界上)。最终规则就是 p = sigmoid(w·x + b),p > 0.5 判为正类。

三、决策边界:一条直线
让 sigmoid 输出 0.5,等价于让 w·x + b = 0。所以逻辑回归的决策边界是一条直线(高维下是超平面),它是一个标准的线性分类器。在可视化里,这条线就是把两类点分隔开的那条边界。
四、交叉熵损失:为什么不用 MSE
衡量「预测概率」与「真实标签」的差距,逻辑回归用的是交叉熵,而不是线性回归那种均方误差。关键原因是:交叉熵关于参数是凸函数,梯度下降一定能收敛到全局最优;而把 sigmoid 套进 MSE 会得到非凸的损失曲面,容易卡在局部极小值。
五、梯度下降训练图解
交叉熵最妙的地方是梯度形式极简:
误差 e = p − label
dw = Σ e·x , db = Σ e
w -= lr·dw/n , b -= lr·db/n
「预测 − 真实」就是误差,和线性回归长得一模一样——这不是巧合,而是广义线性模型的统一之美。每一轮训练分两步:先扫一遍所有点累加梯度,再更新 w 和 b,边界随之平滑旋转、平移,几轮后稳稳卡在两类中间。

六、完整 C++ 实现(带注释)
void fit(vector<Point>& pts, double lr) {
double w1 = 0, w2 = 0, b = 0; // 权重和偏置,初始全 0
for (int it = 0; it < ITERS; it++) { // 迭代 ITERS 轮
double dw1 = 0, dw2 = 0, db = 0; // 每轮把梯度累加器清零
for (auto& p : pts) { // ① 算梯度:扫一遍所有点
double z = w1 * p.x + w2 * p.y + b; // 线性打分
double pr = 1.0 / (1.0 + exp(–z)); // sigmoid 概率
double e = pr – p.label; // 误差 = 预测 − 真实
dw1 += e * p.x; // 累加梯度分量
dw2 += e * p.y;
db += e;
}
w1 -= lr * dw1 / n; // ② 更新权重(n 为样本数)
w2 -= lr * dw2 / n;
b -= lr * db / n;
}
}
实战中还要注意:特征不归一化会导致梯度尺度悬殊、收敛慢(可视化版本已做中心归一化);学习率过大震荡、过小收敛慢;线性不可分时它不会卡死,但边界也分不干净;类别极不平衡时要加权或调阈值。
七、和线性回归的区别
线性回归输出连续值、用 MSE、解决回归问题;逻辑回归在线性打分外套 sigmoid 输出概率、用交叉熵、解决分类问题。两者梯度公式同形,但任务和损失函数本质不同。
八、小结
逻辑回归 = 线性打分 + sigmoid + 交叉熵 + 梯度下降。它简单、可解释、输出概率、训练快,是 CTR 预估、风控评分卡、医学诊断里最常见的基线模型,也是神经网络最后一层的二分类特例。想直观看到决策边界随训练一轮轮平滑旋转的过程,可以在「码路星球」里看这套逐行高亮 + 动画的可视化讲解,完全免费。(我不慌—成长杂货铺,https://wobuhuang.com)
逻辑回归 / 机器学习 / sigmoid / 决策边界 / 交叉熵 / 梯度下降 / 分类算法 / C++ / 算法可视化 / 码路星球



