机器学习数学推导(六)逻辑回归与分类
Chen Kai BOSS

从线性回归到逻辑回归的跨越,标志着机器学习从回归任务到分类任务的重要转变。逻辑回归虽然名为"回归",实则是分类算法的基石,通过引入 Sigmoid 函数建立起线性模型与概率预测的桥梁。本章将深入推导逻辑回归的数学本质:从似然函数的构造到梯度计算的细节,从二分类到多分类的推广,从优化算法到正则化技术,全面揭示分类问题的概率建模思想。

从线性模型到概率分类

线性分类的局限性

回顾线性回归,我们建立了输入与连续输出的线性映射:

但分类任务的标签是离散的(如Extra close brace or missing open bracey \in \{0,1\\}),直接用线性模型有两个问题:

  1. 输出不受约束可能是任意实数,但类别标签需要在有限集合内
  2. 概率解释缺失:线性模型无法给出"样本属于某类的概率"

逻辑回归通过引入链接函数( link function)解决这一矛盾:将线性模型的输出映射到区间,赋予概率意义。

Sigmoid 函数:从实数到概率

Sigmoid 函数定义为:

它具有优雅的数学性质:

性质 1:值域约束

对任意,都有,满足概率的取值要求。

性质 2:对称性

证明

性质 3:导数的自我表示

证明

这一性质是梯度计算简洁性的关键。

下图全面展示了 Sigmoid 函数的核心性质——函数曲线与导数、对称性、与其他激活函数的对比,以及梯度消失问题:

Sigmoid Function Properties

下图更详细地展示了 Sigmoid 函数、交叉熵损失函数以及与阶跃函数的对比——交叉熵损失对错误预测施加严厉的惩罚(趋向无穷),这使得优化更加高效:

Sigmoid and Loss Functions

逻辑回归模型定义

对于二分类任务(Extra close brace or missing open bracey \in \{0,1\\}),定义:

相应地:

统一表示:利用指数形式,两个概率可合并为:

时,公式退化为;当时,退化为

最大似然估计与损失函数

似然函数的构造

给定训练集,假设样本独立同分布(i.i.d.),似然函数为:

代入逻辑回归模型:

对数似然与交叉熵

取对数得对数似然:

最大化对数似然等价于最小化负对数似然:

其中是预测概率。这正是二元交叉熵损失(Binary Cross-Entropy Loss)。

信息论解释:交叉熵衡量真实分布与预测分布的差异:

在二分类中,真实分布对应硬标签,预测分布对应,代入即得上述损失。

与均方误差的对比

如果用均方误差(MSE)作为损失:

计算梯度:

注意到多了一项。当接近 0 或 1 时(即模型非常自信),这一项接近 0,导致梯度消失,即使预测错误也几乎不更新。

而交叉熵损失的梯度为(下节推导):

不含项,避免梯度消失问题。

梯度推导与优化算法

梯度的精确计算

对单个样本的损失:

其中。使用链式法则:

第一步

第二步:利用 Sigmoid 导数性质

第三步

合并

总梯度为:

其中是数据矩阵,是预测与真实标签向量。

Hessian 矩阵与二阶方法

对于牛顿法等二阶优化,需要计算 Hessian 矩阵:

对单样本梯度再次求导:

总 Hessian 为:

其中

正定性分析:对任意

因为(Sigmoid 输出在内)。因此正定,损失函数严格凸的,存在唯一全局最优解。

梯度下降与随机优化

批量梯度下降(BGD):

随机梯度下降(SGD):每次随机选一个样本

小批量梯度下降(Mini-batch GD):每次选批量大小

多分类推广:Softmax 回归

从二分类到多分类

对于类分类(),需要为每个类别学习一个权重向量。定义类别的得分:

使用 Softmax 函数将得分归一化为概率:

其中是参数矩阵。

归一化验证

交叉熵损失与 One-Hot 编码

引入 One-Hot 编码:若真实类别为,则(仅第位为 1)。损失函数为:

其中

化简:由于每个样本只有一个(设为第类),其余为 0,

这是多分类的负对数似然(Negative Log-Likelihood,NLL)。

Softmax 梯度推导

对单样本损失,计算关于的梯度:

第一项

𝟙

第二项

合并

𝟙

进一步关于求导:

总梯度为:

矩阵形式:

其中分别是真实和预测的 One-Hot 矩阵。

下图展示了 Softmax 函数的温度参数效应、交叉熵损失函数的形态、多分类概率分布以及 L2 正则化对权重的衰减作用:

Softmax and Cross Entropy

下图展示了 Softmax 回归的概率分布和多类别决策区域——左图展示当一个 logit 变化时各类概率如何"竞争",右图展示三类数据的决策区域分割:

Softmax Visualization

正则化技术

L2 正则化(岭逻辑回归)

添加 L2 惩罚项:

梯度变为:

更新公式:

项产生权重衰减(weight decay)效果。

L1 正则化( Lasso 逻辑回归)

添加 L1 惩罚:L1 范数在 0 点不可导,使用次梯度:

其中),或)。

稀疏性: L1 正则化倾向于产生稀疏解(许多权重恰好为 0),实现特征选择

弹性网络( Elastic Net)

结合 L1 和 L2:

兼具稀疏性与稳定性。

决策边界与几何解释

二分类决策边界

逻辑回归的决策规则:

由于,决策边界为:

这是特征空间中的超平面

点到边界的距离:对于样本,其到决策边界的有符号距离为:

距离越大,分类越自信。

下图展示了逻辑回归的决策边界:左图显示二分类中概率等高线和线性决策边界;右图展示多分类 Softmax 如何将特征空间划分为不同区域:

Decision Boundary Visualization

下图展示了线性决策边界(左)和非线性决策边界的需求(右)——当数据不是线性可分时,需要特征变换或核方法来构造更复杂的分类面:

Decision Boundaries

下面的动画展示了逻辑回归训练过程中决策边界如何逐步调整——随着梯度下降迭代,决策边界逐渐找到最优位置,交叉熵损失持续下降:

Logistic Regression Training

多分类决策区域

分类中,类别和类别的分界线为:

特征空间被划分为个区域,每个区域对应一个类别。相邻区域的边界是线性的。

模型评估与诊断

混淆矩阵与性能指标

对于二分类,定义:

  • TP( True Positive):真实为正,预测为正
  • FP( False Positive):真实为负,预测为正
  • TN( True Negative):真实为负,预测为负
  • FN( False Negative):真实为正,预测为负

准确率(Accuracy):

精确率(Precision):

召回率( Recall):

F1 分数

ROC 曲线与 AUC

改变决策阈值即判为正类),得到不同的( FPR, TPR)组合:

  • 真正例率( TPR):$ - 假正例率( FPR):$

ROC 曲线:以 FPR 为横轴、 TPR 为纵轴的曲线。

AUC( Area Under Curve): ROC 曲线下面积,度量排序能力。 AUC=1 表示完美分类器, AUC=0.5 表示随机猜测。

概率解释: AUC 等于随机选取一对正负样本,正样本得分高于负样本的概率。

实现细节与数值稳定性

Sigmoid 函数的数值溢出

非常大时,接近 0,但计算可能溢出。稳定实现:

1
2
3
4
5
6
def stable_sigmoid(z):
if z >= 0:
return 1 / (1 + np.exp(-z))
else:
exp_z = np.exp(z)
return exp_z / (1 + exp_z)

Softmax 的数值稳定性

直接计算可能溢出。利用 Softmax 的平移不变性:

1
2
3
4
def stable_softmax(z):
z_max = np.max(z, axis=-1, keepdims=True)
exp_z = np.exp(z - z_max)
return exp_z / np.sum(exp_z, axis=-1, keepdims=True)

完整训练代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import numpy as np

class LogisticRegression:
def __init__(self, learning_rate=0.01, n_iterations=1000,
regularization='l2', lambda_reg=0.01):
self.lr = learning_rate
self.n_iter = n_iterations
self.reg = regularization
self.lambda_reg = lambda_reg
self.w = None

def sigmoid(self, z):
return np.where(z >= 0,
1 / (1 + np.exp(-z)),
np.exp(z) / (1 + np.exp(z)))

def fit(self, X, y):
N, d = X.shape
self.w = np.zeros(d)

for _ in range(self.n_iter):
# 前向传播
z = X @ self.w
y_hat = self.sigmoid(z)

# 计算梯度
grad = X.T @ (y_hat - y) / N

# 添加正则化
if self.reg == 'l2':
grad += self.lambda_reg * self.w
elif self.reg == 'l1':
grad += self.lambda_reg * np.sign(self.w)

# 梯度下降
self.w -= self.lr * grad

def predict_proba(self, X):
return self.sigmoid(X @ self.w)

def predict(self, X, threshold=0.5):
return (self.predict_proba(X) >= threshold).astype(int)

# 示例使用
if __name__ == '__main__':
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, roc_auc_score

# 生成数据
X, y = make_classification(n_samples=1000, n_features=20,
n_informative=15, n_redundant=5,
random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42)

# 训练模型
model = LogisticRegression(learning_rate=0.1, n_iterations=1000,
regularization='l2', lambda_reg=0.01)
model.fit(X_train, y_train)

# 评估
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)

print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")
print(f"AUC: {roc_auc_score(y_test, y_prob):.4f}")

多分类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class SoftmaxRegression:
def __init__(self, learning_rate=0.01, n_iterations=1000,
lambda_reg=0.01):
self.lr = learning_rate
self.n_iter = n_iterations
self.lambda_reg = lambda_reg
self.W = None

def softmax(self, Z):
"""稳定的 Softmax 计算"""
Z_max = np.max(Z, axis=1, keepdims=True)
exp_Z = np.exp(Z - Z_max)
return exp_Z / np.sum(exp_Z, axis=1, keepdims=True)

def fit(self, X, y):
N, d = X.shape
K = len(np.unique(y))
self.W = np.zeros((d, K))

# 转为 One-Hot 编码
Y_one_hot = np.zeros((N, K))
Y_one_hot[np.arange(N), y] = 1

for _ in range(self.n_iter):
# 前向传播
Z = X @ self.W
Y_hat = self.softmax(Z)

# 计算梯度
grad = X.T @ (Y_hat - Y_one_hot) / N
grad += self.lambda_reg * self.W # L2 正则化

# 更新权重
self.W -= self.lr * grad

def predict_proba(self, X):
Z = X @ self.W
return self.softmax(Z)

def predict(self, X):
return np.argmax(self.predict_proba(X), axis=1)

# 示例使用
if __name__ == '__main__':
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 生成多分类数据
X, y = make_classification(n_samples=1000, n_features=20,
n_informative=15, n_redundant=5,
n_classes=5, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42)

# 训练模型
model = SoftmaxRegression(learning_rate=0.1, n_iterations=1000,
lambda_reg=0.01)
model.fit(X_train, y_train)

# 评估
y_pred = model.predict(X_test)
print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")

与其他分类器的联系

与感知机的关系

感知机更新规则:

其中是硬分类。逻辑回归将其软化为概率预测,训练更稳定。

与线性判别分析( LDA)的关系

LDA 假设每类数据服从高斯分布,且协方差矩阵相同。在此假设下,后验概率为:

形式与逻辑回归相同。区别: - LDA:生成式模型,估计 - 逻辑回归:判别式模型,直接估计

与神经网络的关系

逻辑回归可视为单层神经网络

线

Softmax 回归是单层多类神经网络,是深度学习的基石。

进阶主题

类别不平衡问题

当正负样本比例严重失衡(如负样本),模型倾向于预测负类。解决方法:

1. 调整决策阈值:根据业务需求调整(如降低阈值增加召回率)

2. 重采样: - 上采样少数类( SMOTE 等) - 下采样多数类

3. 损失加权

其中根据类别频率设定(如)。

在线学习与流式数据

对于流式到达的数据,使用随机梯度下降逐个更新:

适合大规模或实时场景。

多标签分类

每个样本可属于多个类别(如文本标注)。对每个标签独立训练二分类器:

损失为各标签交叉熵之和:

Q&A 精选

Q1:为什么叫"逻辑回归"而不是"逻辑分类"?

A:历史原因。逻辑回归最早用于回归问题的概率建模,通过 Logistic 函数(即 Sigmoid)将线性模型输出映射到概率。后来发现其更适合分类任务,但名称保留至今。


Q2:逻辑回归与线性回归的本质区别是什么?

A:核心区别在于输出空间与损失函数: - 线性回归:,用 MSE 损失,假设噪声服从高斯分布 - 逻辑回归:Extra close brace or missing open bracey \in \{0,1\\},用交叉熵损失,假设标签服从伯努利分布

两者都是广义线性模型( GLM)的特例,只是链接函数和假设分布不同。


Q3:为什么交叉熵比 MSE 更适合分类?

A:MSE 的梯度含有项,当预测非常自信()但错误时,梯度接近 0,几乎不更新。而交叉熵的梯度为,即使自信错误也能产生大梯度,快速纠正。


Q4:逻辑回归能拟合非线性边界吗?

A:原始逻辑回归是线性分类器,决策边界为超平面。但可通过: - 特征工程:添加多项式特征(如) - 核方法:隐式映射到高维空间 - 神经网络:多层逻辑回归堆叠

实现非线性分类。


Q5: Softmax 与多个独立 Sigmoid 的区别?

A: - Softmax:各类别概率归一化,,用于互斥多分类(单标签) - 多 Sigmoid:各标签独立,概率和可,用于多标签分类

例如新闻分类(单类别)用 Softmax,标签推荐(多标签)用多 Sigmoid。


Q6:正则化参数如何选择?

A:通过交叉验证网格搜索:

  1. 候选值:
  2. 对每个,在验证集上评估性能
  3. 选择验证误差最小的

一般越大,模型越简单(欠拟合风险),越小越复杂(过拟合风险)。


Q7:逻辑回归为什么是凸优化问题?

A: Hessian 矩阵正定(),因此损失函数严格凸。凸性保证: - 任何局部最优即全局最优 - 梯度下降等算法必收敛

这是逻辑回归的重要优势。


Q8:逻辑回归能处理缺失值吗?

A:标准逻辑回归不直接支持。常见处理方法: - 删除:删除含缺失值的样本(损失信息) - 填充:用均值/中位数/众数填充 - 指示变量:为缺失特征添加二元指示器 - 模型预测:用其他特征预测缺失值

或使用支持缺失值的算法(如 XGBoost)。


Q9:为什么需要特征标准化?

A:不同特征量纲不同(如年龄[0,100]vs 收入[0,1e6]),导致: 1. 梯度数值范围差异大,需要极小学习率 2. 某些特征主导权重更新 3. 正则化不公平(惩罚大量纲特征)

标准化()使各特征同尺度,优化更稳定。


Q10:逻辑回归与 SVM 的区别?

A: | 维度 | 逻辑回归 | SVM | |------|----------|-----| | 损失 | 交叉熵 | Hinge Loss | | 输出 | 概率 | 决策值 | | 支持向量 | 所有样本参与 | 仅边界样本 | | 核技巧 | 不直接支持 | 天然支持 | | 凸性 | 严格凸 | 凸 |

逻辑回归适合概率预测, SVM 适合硬分类与非线性边界。


Q11:如何解释逻辑回归的系数?

A:权重表示特征对对数几率(log-odds)的影响:

-增大,正类概率增大 -增大,负类概率增大 -大:影响强

几率比增加 1 单位,几率( odds)乘以


Q12:逻辑回归的时间复杂度是多少?

A: - 单次迭代(矩阵乘法) - 总训练是迭代次数 - 预测个样本)

对于大规模数据,使用随机梯度下降( SGD)或小批量梯度下降,单次迭代降至是批量大小)。


实验与案例

案例 1:垃圾邮件分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# 模拟数据
emails = [
"Win a free iPhone now!",
"Meeting at 3pm tomorrow",
"You have won$1,000,000!",
"Project deadline reminder",
# ... 更多邮件
]
labels = [1, 0, 1, 0, ...] # 1=垃圾邮件, 0=正常

# 文本特征提取
vectorizer = TfidfVectorizer(max_features=1000)
X = vectorizer.fit_transform(emails).toarray()

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
X, labels, test_size=0.2, random_state=42)

# 训练模型
model = LogisticRegression(learning_rate=0.1, n_iterations=1000,
regularization='l2', lambda_reg=0.1)
model.fit(X_train, y_train)

# 评估
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

# 特征重要性分析
feature_names = vectorizer.get_feature_names_out()
top_indices = np.argsort(np.abs(model.w))[-10:] # 最重要的 10 个特征
print("最相关词语:", feature_names[top_indices])

案例 2:医疗诊断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt

# 加载数据
data = load_breast_cancer()
X, y = data.data, data.target

# 标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 划分数据
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42)

# 训练不同正则化强度的模型
lambdas = [0, 0.01, 0.1, 1.0]
for lam in lambdas:
model = LogisticRegression(learning_rate=0.1, n_iterations=1000,
regularization='l2', lambda_reg=lam)
model.fit(X_train, y_train)

y_prob = model.predict_proba(X_test)
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)

plt.plot(fpr, tpr, label=f'λ={lam} (AUC={roc_auc:.3f})')

plt.plot([0,1], [0,1], 'k--', label='Random')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curves with Different Regularizations')
plt.legend()
plt.show()

✏️ 练习题与解答

练习 1:Sigmoid 函数性质

题目:证明 Sigmoid 函数满足

解答

导数

对称性

这个性质非常重要——它意味着,简化了概率计算。

练习 2:交叉熵损失推导

题目:从最大似然估计出发,推导二分类逻辑回归的交叉熵损失函数。

解答

。对个样本,似然函数为:

对数似然:

最大化对数似然等价于最小化负对数似然,即交叉熵损失:

练习 3:Softmax 梯度

题目:推导 Softmax 回归中,损失函数对 logit 的梯度

解答

Softmax:,交叉熵损失:

首先求

因此:

这个优美的结果()与逻辑回归的梯度形式完全一致。

练习 4:正则化的贝叶斯解释

题目:说明 L2 正则化逻辑回归对应于什么样的先验分布?L1 正则化呢?

解答

L2 正则化

对应高斯先验,因为

L1 正则化

对应拉普拉斯先验,因为

拉普拉斯先验在零处有尖峰,这就是 L1 能产生稀疏解的原因——MAP 估计倾向于将小系数精确设为零。

练习 5:决策边界的几何意义

题目:证明逻辑回归的决策边界是一个超平面,并说明如何决定该超平面。

解答

等价于,即

这是一个法向量为、偏置为的超平面:

  • 的方向决定了超平面的朝向(垂直于决策边界)
  • 决定了"过渡区域"的宽度——越大,从的过渡越陡峭
  • 决定了超平面到原点的距离

到决策边界的有符号距离为,且,即预测概率仅取决于点到决策边界的距离。

参考文献

  1. Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer. [Chapter 4: Linear Models for Classification]
  2. Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning (2nd ed.). Springer. [Chapter 4: Linear Methods for Classification]
  3. Murphy, K. P. (2012). Machine Learning: A Probabilistic Perspective. MIT Press. [Chapter 8: Logistic Regression]
  4. Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press. [Chapter 5: Machine Learning Basics]
  5. Ng, A. Y., & Jordan, M. I. (2002). On discriminative vs. generative classifiers: A comparison of logistic regression and naive Bayes. Advances in Neural Information Processing Systems, 14.
  6. Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression (3rd ed.). Wiley.
  7. Wright, R. E. (1995). Logistic regression. In Reading and Understanding Multivariate Statistics (pp. 217-244). American Psychological Association.

逻辑回归以其简洁的数学形式、清晰的概率解释和高效的优化算法,成为分类任务的基准模型。从 Sigmoid 到 Softmax,从梯度下降到正则化,本章完整推导了逻辑回归的理论框架。理解逻辑回归不仅是掌握经典机器学习的基础,更是深入神经网络与深度学习的必经之路——毕竟,深度神经网络的每一层都蕴含着逻辑回归的影子。

  • 本文标题:机器学习数学推导(六)逻辑回归与分类
  • 本文作者:Chen Kai
  • 创建时间:2021-09-24 15:30:00
  • 本文链接:https://www.chenk.top/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E6%95%B0%E5%AD%A6%E6%8E%A8%E5%AF%BC%EF%BC%88%E5%85%AD%EF%BC%89%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92%E4%B8%8E%E5%88%86%E7%B1%BB/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论