下面是一篇偏技术博客风格、但尽量通俗、好懂的逻辑回归讲解文章,你可以直接当作学习笔记或发布用草稿 ✅一文搞懂逻辑回归(Logistic Regression) 关键词分类算法、Sigmoid、概率、线性决策边界一、为什么会有逻辑回归我们先从直觉说起。假如你想用程序判断这封邮件是不是垃圾邮件这个用户会不会流失这笔交易有没有欺诈风险这些问题都有一个共同点结果只有两类是 / 否你可能第一反应是用线性回归行不行答案是不太行。因为线性回归的输出是ywTxb它的范围是负无穷到正无穷而我们想要的是一个01 之间的概率值。于是逻辑回归就登场了。二、逻辑回归的核心思想逻辑回归的思路非常简单只有两步1️⃣ 先用线性回归算一个“分数”2️⃣ 再用一个函数把这个分数“压扁”到 01这个函数就是——Sigmoid 函数。三、Sigmoid把一切变成概率Sigmoid 函数的公式是σ(z)1e−z1​它的图像长这样想象一下1 ──────────────╮ │ 0.5 │ │ 0 ──────────────╯特点很关键输入越大输出越接近 1输入越小输出越接近 0中间是平滑的 S 形曲线四、逻辑回归的完整公式设zw1​x1​w2​x2​⋯wn​xn​b那么逻辑回归模型就是这里的含义是在给定特征 x 的情况下样本属于“正类”的概率例如y^​0.92→ 92% 可能是垃圾邮件y^​0.03→ 几乎不是垃圾邮件五、怎么分类逻辑回归本身输出的是概率分类规则通常是人为设定的如果 ŷ ≥ 0.5 → 类别 1 如果 ŷ 0.5 → 类别 0对应回 zwᵀx b ≥ 0 → 类别 1 wᵀx b 0 → 类别 0 这说明逻辑回归的决策边界是线性的​这是面试和考试高频点六、逻辑回归是怎么学习的逻辑回归不用“最小二乘法”而是用极大似然估计​ 或交叉熵损失直观理解就是预测对了 → 惩罚很小预测错了 → 惩罚很大错得离谱 → 惩罚爆炸式增长然后通过梯度下降不断调整参数。七、逻辑回归有什么优点✅输出概率可解释性强​✅训练速度快计算简单​✅不容易过拟合参数少​✅工业界非常常用很多真实系统中信用评分广告点击率预估风控系统底层都有逻辑回归的身影。八、逻辑回归的局限性❌ 只能处理线性可分问题❌ 对特征工程依赖较大❌ 多分类需要扩展Softmax但话说回来在工业界“简单可靠”往往比“复杂炫酷”更重要。九、一句话总结逻辑回归 线性回归 Sigmoid用来解决二分类问题输出概率用 0.5 作为分类阈值决策边界是线性的。十、从零实现一个逻辑回归NumPy 版不调 sklearn从 0 手写一个逻辑回归并真正理解它在做什么关键词Sigmoid、交叉熵、梯度下降、纯 NumPy10.1 我们要做什么我们要用Python NumPy​ 实现Sigmoid 函数损失函数交叉熵梯度下降预测函数最终能用它来做二分类任务。⚠️ 全程不依赖 sklearn 的LogisticRegression。10.2 逻辑回归的数学回顾极简版逻辑回归的核心公式y^​σ(wTxb)其中σ(z)1e−z1​损失函数交叉熵L−N1​∑[ylog(y^​)(1−y)log(1−y^​)]梯度记住结论即可∂w∂L​N1​XT(y^​−y)∂b∂L​N1​∑(y^​−y)10.3 准备数据造一点简单数据我们用一个线性可分的小数据集import numpy as np # 特征 X np.array([ [1.0, 2.0], [2.0, 1.0], [2.0, 3.0], [3.0, 2.0], ]) # 标签0 或 1 y np.array([0, 0, 1, 1])10.4 Step 1实现 Sigmoiddef sigmoid(z): return 1 / (1 np.exp(-z))✅ 把任意实数压缩到 (0, 1)✅ 这就是“概率”的来源10.5 Step 2初始化参数def initialize_parameters(n_features): w np.zeros(n_features) b 0.0 return w, b一开始什么都不懂权重全设为 0。10.6 Step 3前向传播预测概率def forward(X, w, b): z np.dot(X, w) b y_hat sigmoid(z) return y_hat这里得到的y_hat就是每个样本属于类别 1 的概率10.7 Step 4计算损失交叉熵def compute_loss(y, y_hat): m y.shape[0] loss -np.mean( y * np.log(y_hat 1e-8) (1 - y) * np.log(1 - y_hat 1e-8) ) return loss✅ 加1e-8是为了防止 log(0)✅ 损失越小说明预测越准10.8 Step 5反向传播算梯度def backward(X, y, y_hat): m X.shape[0] dw (1/m) * np.dot(X.T, (y_hat - y)) db (1/m) * np.sum(y_hat - y) return dw, db这一步是逻辑回归的灵魂 梯度告诉参数该怎么改10.9 Step 6梯度下降更新参数def update_parameters(w, b, dw, db, lr0.1): w w - lr * dw b b - lr * db return w, blr是学习率梯度下降的本质就是沿着损失下降最快的方向走一步10.10 Step 7训练逻辑回归def train(X, y, epochs1000, lr0.1): w, b initialize_parameters(X.shape[1]) for i in range(epochs): y_hat forward(X, w, b) loss compute_loss(y, y_hat) dw, db backward(X, y, y_hat) w, b update_parameters(w, b, dw, db, lr) if i % 200 0: print(fEpoch {i}, Loss: {loss:.4f}) return w, b10.11 Step 8用训练好的模型做预测def predict(X, w, b, threshold0.5): y_hat forward(X, w, b) return (y_hat threshold).astype(int)10.12 跑起来w, b train(X, y) y_pred predict(X, w, b) print(预测结果:, y_pred) print(真实标签:, y)你会看到✅ 损失在不断下降✅ 预测结果越来越准10.13 这段代码说明了什么逻辑回归并不神秘本质就是线性加权Sigmoid交叉熵梯度下降所谓“算法工程师”很多时候就是在写这些循环。最终总结逻辑回归 线性模型 Sigmoid 交叉熵 梯度下降