1. 从跃阶函数到Sigmoid:理解对数几率回归的本质
在机器学习分类任务中,我们常常需要处理二分类问题。最直观的想法是使用跃阶函数(单位阶跃函数)作为分类器的输出:当输入大于某个阈值时输出1,否则输出0。但这种函数存在明显的缺陷——它在阈值点不连续,导致无法使用基于梯度的优化方法。
Sigmoid函数(也称为逻辑函数)完美解决了这个问题:
σ(z) = 1 / (1 + e^{-z})
这个函数的输出范围在(0,1)之间,可以解释为样本属于正类的概率。当z趋近于正无穷时,σ(z)趋近于1;当z趋近于负无穷时,σ(z)趋近于0;在z=0处,σ(z)=0.5。
实际应用中,我们通常将线性模型w^Tx+b的输出作为Sigmoid函数的输入,形成对数几率回归模型:P(y=1|x) = σ(w^Tx+b)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 交叉熵损失函数的双重推导
2.1 极大似然估计视角
假设我们有数据集D={(x_i,y_i)},其中y_i∈{0,1}。对数几率回归模型的似然函数可以表示为:
L(w,b) = ∏[P(y=1|x_i)]^{y_i} [1-P(y=1|x_i)]^
取负对数得到损失函数:
J(w,b) = -∑[y_i log(σ(w^Tx_i+b)) + (1-y_i)log(1-σ(w^Tx_i+b))]
这就是我们熟知的交叉熵损失函数。通过最小化这个损失函数,我们可以得到模型参数的最大似然估计。
2.2 信息论视角
从信息论的角度,交叉熵衡量的是两个概率分布之间的差异。对于真实分布p和模型预测分布q,交叉熵定义为:
H(p,q) = -∑p(x)logq(x)
在二分类问题中,真实分布可以表示为:
p(y|x) = yδ(1) + (1-y)δ(0)
其中δ是狄拉克函数。
模型预测分布为:
q(y|x) = σ(w^Tx+b)^y [1-σ(w^Tx+b)]^
将这两个分布代入交叉熵定义,我们得到了与极大似然估计完全相同的表达式。这种数学上的"殊途同归"展示了不同理论体系之间的内在一致性。
3. 二分类线性判别分析(LDA)的几何解释
3.1 基本思想
线性判别分析的核心思想是:将高维数据投影到一条直线上,使得:
- 不同类别的样本投影点尽可能远离(类间散度大)
- 同一类别的样本投影点尽可能接近(类内散度小)
数学上,我们定义:
- 类间散度矩阵:S_b = (μ_1-μ_0)(μ_1-μ_0)^T
- 类内散度矩阵:S_w = ∑{x∈X_0}(x-μ_0)(x-μ_0)^T + ∑(x-μ_1)(x-μ_1)^T
其中μ_0和μ_1分别是两类样本的均值向量。
3.2 优化目标的建立
我们希望找到投影方向w,使得投影后的数据满足:
J(w) = w^T S_b w / w^T S_w w
最大化
这个比值被称为广义瑞利商。为了求解这个优化问题,我们可以使用拉格朗日乘数法。
3.3 求解过程
固定分母w^T S_w w=1,最大化分子w^T S_b w。构建拉格朗日函数:
L(w,λ) = w^T S_b w - λ(w^T S_w w - 1)
对w求导并令导数为零:
2S_b w - 2λS_w w = 0 ⇒ S_b w = λS_w w
这是一个广义特征值问题。注意到S_b = (μ_1-μ_0)(μ_1-μ_0)^T是秩1矩阵,解可以显式表示为:
w = S_w^{-1}(μ_1-μ_0)
4. 矩阵求导技巧与实现细节
4.1 常用矩阵求导公式
在推导过程中,我们需要以下矩阵求导公式:
∂(w^T A w)/∂w = (A + A^T)w
当A对称时,简化为2Aw
对于线性判别分析的推导,我们使用了这个性质,因为S_b和S_w都是对称矩阵。
4.2 数值稳定性处理
实际计算中,S_w可能不可逆。常见的解决方案包括:
- 加入小的正则项:S_w + λI
- 先进行PCA降维,再应用LDA
- 使用伪逆代替逆矩阵
在sklearn的实现中,默认会加入一个小的正则项来保证数值稳定性。
5. 两种方法的比较与选择
5.1 对数几率回归 vs LDA
| 特性 | 对数几率回归 | 线性判别分析 |
|---|---|---|
| 假设 | 仅假设P(y | x)的形式 |
| 输出 | 直接估计类概率 | 通过密度比间接得到类概率 |
| 鲁棒性 | 对分布假设不敏感 | 依赖分布假设 |
| 计算 | 需要迭代优化 | 有解析解 |
| 多分类 | 需要扩展 | 天然支持 |
5.2 实际应用建议
- 当各类数据明显不满足高斯分布假设时,优先选择对数几率回归
- 当样本量较小且分布假设合理时,LDA通常表现更好
- 在特征维度很高时,可以先使用LDA降维,再应用其他分类器
6. 实现示例与常见问题
6.1 Python实现示例
python复制# 对数几率回归
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train, y_train)
# 线性判别分析
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis()
lda.fit(X_train, y_train)
6.2 常见问题排查
-
收敛问题:
- 对数几率回归不收敛:尝试调整优化算法或正则化强度
- 检查特征尺度是否差异过大,考虑标准化
-
性能问题:
- LDA表现不佳:验证数据是否近似满足高斯假设
- 考虑使用二次判别分析(QDA)放松同协方差的假设
-
数值问题:
- 奇异矩阵警告:增加正则化参数或先进行降维
7. 数学基础深入理解
7.1 广义特征值问题
标准特征值问题形式为Ax=λx,而广义特征值问题形式为Ax=λBx。在LDA中,我们需要解S_b w = λ S_w w,这就是一个广义特征值问题。
当S_w可逆时,可以转化为标准特征值问题:
S_w^{-1} S_b w = λ w
7.2 瑞利商的性质
瑞利商R(w) = w^T A w / w^T B w有以下重要性质:
- 最大值等于A相对于B的最大广义特征值
- 最小值等于A相对于B的最小广义特征值
- 临界点对应于广义特征向量
这些性质保证了我们通过求解广义特征值问题就能找到最优投影方向。
8. 扩展与进阶方向
-
多分类扩展:
- 对数几率回归:使用softmax函数替代sigmoid
- LDA:同时优化多个投影方向
-
非线性扩展:
- 核对数几率回归
- 核判别分析
-
正则化变体:
- L1/L2正则化的逻辑回归
- 稀疏LDA
-
概率视角:
- 将LDA理解为生成模型
- 贝叶斯逻辑回归
在实际项目中,我通常会先尝试简单的线性模型作为baseline,因为它们训练速度快、解释性强,往往能提供不错的性能。特别是在特征工程阶段,线性模型可以帮助快速验证特征的有效性。当线性假设明显不成立时,再考虑更复杂的非线性模型。
