Skip to content

第3章 线性模型 ​

🎯 学习目标 ​

  • 理解线性回归的数学原理和最小二乘法
  • 掌握梯度下降算法的工作机制和参数调优
  • 理解逻辑回归和 Sigmoid 函数在分类问题中的应用
  • 掌握线性判别分析(LDA)的降维与分类思想
  • 了解多分类学习的拆分策略(OvO/OvR/ECOC)
  • 认识类别不平衡问题及其应对策略
  • 认识正则化(L1/L2)对模型复杂度的控制作用
  • 掌握损失函数的概念及其在模型训练中的核心地位

3.1 线性回归 (Linear Regression) ​

📊 什么是线性回归?

线性回归试图学习一个线性函数来拟合数据,是最简单但也最常用的回归模型。给定数据集 D,线性回归试图学到一个函数来映射输入和输出的关系:

f(x)=wx+b

其中 w 是权重(斜率),b 是偏置(截距)。我们的目标是找到最优的 w 和 b,使得预测值 f(x) 尽可能接近真实值 y。

📐 均方误差损失 (MSE Loss)

我们使用均方误差(Mean Squared Error)来衡量模型的好坏:

L(w,b)=1n∑i=1n(yi−f(xi))2

为什么用平方?

  • 确保误差总是正数
  • 惩罚大的误差更严重
  • 数学性质良好,易于求导

最小二乘法: 通过令损失函数的导数为 0,可以直接求出解析解(闭式解)。

交互式演示 ​

手动调整参数观察拟合效果,或点击"梯度下降训练"观看算法自动寻找最优解。红色线段表示预测误差(残差),损失函数就是所有残差平方的平均值。

模型参数

当前模型: y = 2.00x + 1.00

损失函数 (MSE)

当前损失:0.00
● 训练数据点
━ 当前拟合线
| 预测误差(残差)

💡 手动调整斜率和截距,观察损失函数的变化。点击"梯度下降训练"观看算法自动寻找最优解的过程。

3.2 梯度下降 (Gradient Descent) ​

🎯 优化的艺术

梯度下降是机器学习中最重要的优化算法。它的核心思想非常直观:沿着函数下降最快的方向(负梯度方向)移动,逐步逼近最优解。

更新规则 ​

θ←θ−α⋅∂L∂θ
符号含义
θ (theta)待优化的参数
α (alpha)学习率(步长)
∂L∂θ损失函数的梯度

✓ 梯度下降的优势

  • 适用于高维问题
  • 不需要矩阵求逆
  • 可处理大规模数据
  • 容易并行化

⚠️ 学习率的选择

  • 太小:收敛缓慢
  • 太大:可能震荡或发散
  • 建议:从小开始逐步调整

梯度下降可视化(2D) ​

调整学习率和初始位置,观察优化过程。红色虚线表示当前的梯度方向(损失函数的切线),紫色路径显示参数的更新轨迹。

当前状态

迭代次数:0
参数 x:8.000
损失 L(x):37.000
梯度 ∂L/∂x:12.000

更新规则: x ← x - α·∂L/∂x

━
蓝色曲线

损失函数 L(x) = (x-2)² + 1

●
橙色圆点

当前参数位置

━ ━
红色虚线

当前梯度方向(切线)

· · ·
紫色路径

优化轨迹

3D 损失曲面可视化 ​

探索不同损失函数的三维形状,观察梯度下降在 3D 空间中的优化轨迹。拖拽旋转视角,体验从简单凸优化到复杂地形的挑战。

损失函数类型
学习率: 0.10
二次函数 (Quadratic)
最简单的凸优化问题,全局最优解在原点
公式: L(w₁, w₂) = w₁² + w₂²
梯度: ∇L = [2w₁, 2w₂]
图例
起始点
优化路径
终止点
拖拽旋转 · 滚轮缩放 · 右键平移

代码实践:实现梯度下降 ​

python
def gradient_descent(learning_rate, num_iterations):
    """
    使用梯度下降优化 f(x) = x^2

    参数:
        learning_rate: 学习率
        num_iterations: 迭代次数

    返回:
        x: 最终的 x 值
        history: 优化过程中的 x 值列表
    """
    x = 10.0  # 初始值
    history = [x]

    for i in range(num_iterations):
        # 计算梯度 df/dx = 2x
        gradient = 2 * x

        # 更新 x 值
        x = x - learning_rate * gradient

        history.append(x)

    return x, history

# 测试代码
final_x, path = gradient_descent(learning_rate=0.1, num_iterations=20)
print(f"最终 x 值: {final_x:.6f}")
print(f"最终 f(x) 值: {final_x**2:.6f}")
print(f"优化路径长度: {len(path)}")

3.3 逻辑回归 (Logistic Regression) ​

🔄 从回归到分类

尽管名字里有"回归",但逻辑回归实际上是一个分类算法。它通过 Sigmoid 函数将线性模型的输出映射到 (0, 1) 区间,表示样本属于正类的概率。

Sigmoid 函数 ​

σ(z)=11+e−z

其中 z=w1⋅x1+w2⋅x2+…+b(线性组合)

条件结果
z→+∞σ(z)→1
z=0σ(z)=0.5
z→−∞σ(z)→0

✂️ 决策边界

当 σ(z)=0.5 时,即 z=0,这就是决策边界。对于二维特征空间,决策边界是一条直线:w1⋅x1+w2⋅x2+b=0。这条线将空间划分为两个区域,分别对应两个类别。

交互式演示 ​

调整权重和偏置参数,观察决策边界如何移动。背景颜色表示分类概率:蓝色表示倾向于正类,红色表示倾向于负类。虚线是 P=0.5 的决策边界。

模型参数

决策边界方程:
1.00·x₁ + 1.00·x₂ + 0.00 = 0

分类性能

0.0%
准确率

Sigmoid 函数

σ(z) = 1 / (1 + e⁻ᶻ)
其中 z = w₁·x₁ + w₂·x₂ + b
输出范围: (0, 1)决策阈值: 0.5
绿色圆点正类样本 (label = 1)
红色圆点负类样本 (label = 0)
虚线决策边界 (P = 0.5)

🎨 背景颜色表示分类概率:红色区域倾向于类别 0,蓝色区域倾向于类别 1。调整参数观察决策边界如何移动。

3.4 线性判别分析 (Linear Discriminant Analysis) ​

📐 Fisher 判别的思想

线性判别分析(LDA)的核心思想是:将样本投影到一条直线上,使得同类样本的投影尽可能近(类内散度小),异类样本的投影尽可能远(类间散度大)。

散度矩阵 ​

给定数据集 D={(xi,yi)},其中 yi∈{0,1},定义:

  • 第 i 类的均值向量:μi=1|Xi|∑x∈Xix
  • 类内散度矩阵:Sw=∑i=01∑x∈Xi(x−μi)(x−μi)T
  • 类间散度矩阵:Sb=(μ0−μ1)(μ0−μ1)T

最优投影方向 ​

LDA 的目标是最大化广义瑞利商:

J(w)=wTSbwwTSww

即最大化类间散度与类内散度的比值。通过拉格朗日乘子法,最优解为:

w∗=Sw−1(μ0−μ1)

🔍 LDA vs PCA

比较维度LDAPCA
类型监督降维无监督降维
目标最大化类别可分性最大化数据方差
利用标签✅ 是❌ 否
最大维度类别数 - 1不受限
适用场景分类预处理通用降维

3.5 多分类学习 ​

🎯 从二分类到多分类

现实中很多问题涉及多个类别(如手写数字识别有 0-9 共 10 类)。基本思路是将多分类任务拆解为若干个二分类任务来求解。

拆分策略 ​

策略全称训练分类器数思想
OvOOne-vs-OneN(N−1)2每两个类别训练一个分类器,投票决定
OvROne-vs-RestN每个类别 vs 其余所有类别
MvMMany-vs-Many由编码矩阵决定多个类别分为两组,多次划分

OvO(一对一)

  • 训练 N(N−1)/2 个分类器
  • 每个分类器只用两个类别的数据
  • 预测时投票:票数最多的类别胜出
  • ✅ 训练速度快(每个分类器数据量小)
  • ⚠️ 分类器数量多

OvR(一对其余)

  • 训练 N 个分类器
  • 每个分类器用一个类别 vs 其余全部
  • 预测时选置信度最高的分类器
  • ✅ 分类器数量少
  • ⚠️ 训练数据不平衡

📦 纠错输出码 (ECOC)

ECOC 是 MvM 的一种实现。对 N 个类别进行 M 次划分,每次将类别分为正类和反类(编码矩阵),训练 M 个分类器。预测时将测试样本的 M 个预测结果组成编码,与各类别的编码比较,选择海明距离或欧氏距离最近的类别。

ECOC 具有一定的纠错能力:即使某个分类器出错,仍可能通过编码冗余得到正确的分类结果。

3.6 类别不平衡问题 ​

⚖️ 当数据不平衡时

在很多实际场景中,不同类别的样本数量差距悬殊(如欺诈检测中,正常交易远多于欺诈交易)。此时分类器倾向于将所有样本预测为多数类,导致少数类的识别能力很差。

应对策略 ​

策略方法说明
欠采样减少多数类样本随机丢弃多数类样本,使两类数量接近。缺点:可能丢失重要信息。代表方法:EasyEnsemble
过采样增加少数类样本复制或合成少数类样本。代表方法:SMOTE(在少数类样本之间插值生成新样本)
阈值移动调整决策阈值不改变数据,将决策阈值从 0.5 调整为 m+m−,使决策面向少数类偏移

💡 代价敏感学习

另一种思路是为不同类型的错误赋予不同的代价(misclassification cost)。例如,在医疗诊断中,漏诊的代价远高于误诊。通过代价矩阵,让模型在训练时考虑错误的不对称性:

最小化∑iC(yi,y^i)⋅1[yi≠y^i]

其中 C(yi,y^i) 是将类别 yi 误判为 y^i 的代价。

3.7 正则化 (Regularization) ​

🛡️ 防止过拟合的利器

正则化通过在损失函数中添加惩罚项来限制模型复杂度,防止过拟合。两种最常用的正则化方法是 L1 和 L2 正则化。

L2 正则化(Ridge) ​

L=L0+λ⋅∑wi2
  • 惩罚权重的平方和
  • 倾向于产生小但非零的权重
  • 适合特征之间相关性高的情况
  • 解析解存在(可直接求解)

L1 正则化(Lasso) ​

L=L0+λ⋅∑|wi|
  • 惩罚权重的绝对值和
  • 倾向于产生稀疏解(很多权重为 0)
  • 可用于特征选择
  • 更具解释性

⚖️ 正则化系数 λ (lambda)

λ 控制正则化的强度:

  • λ = 0:无正则化,可能过拟合
  • λ 太大:欠拟合,模型过于简单
  • λ 适中:在偏差和方差之间取得平衡

📐 L1 vs L2:几何直观

L2: 圆形约束 — 在参数空间中,L2 正则化的约束区域是一个圆(或高维的球)。损失函数等高线与圆的切点通常不在坐标轴上,所以权重不会变成 0。

L1: 菱形约束 — L1 正则化的约束区域是菱形(或高维的超菱形)。等高线更容易在菱形的顶点(坐标轴)处相交,导致某些权重精确为 0。

📝 本章小结 ​

总结

  • ✅ 线性回归通过最小化均方误差学习线性函数,可用解析解或梯度下降求解
  • ✅ 梯度下降是核心的优化算法,沿负梯度方向迭代更新参数
  • ✅ 学习率是关键超参数,需要仔细调整以平衡收敛速度和稳定性
  • ✅ 逻辑回归使用 Sigmoid 函数将线性输出映射为概率,用于二分类问题
  • ✅ LDA 通过最大化类间散度与类内散度之比寻找最优投影方向
  • ✅ 多分类学习可通过 OvO、OvR、ECOC 等拆分策略实现
  • ✅ 类别不平衡可通过欠采样、过采样(SMOTE)、阈值移动或代价敏感学习应对
  • ✅ 正则化(L1/L2)通过惩罚项控制模型复杂度,防止过拟合
  • ✅ L1 倾向于稀疏解(特征选择),L2 倾向于权重衰减

基于周志华《机器学习》教材