第 2 课
← 返回系列列表

第2周:多变量线性回归与特征缩放

吴恩达机器学习 (2014) — 交互式学习笔记

多变量线性回归、特征缩放、学习率选择、正规方程与矩阵推导。

第2周:多变量线性回归与特征缩放

课程简介

多变量线性回归、特征缩放、学习率选择、正规方程与矩阵推导。

🎬 本课程视频:吴恩达机器学习 (2014) — 交互式学习笔记


一、多变量线性回归

1.1 多特征问题

在实际的房价预测问题中,仅仅使用房屋面积作为特征远远不够。影响房价的因素有很多:卧室数量、楼层数、房龄、地理位置、周边学校评分。我们需要同时利用多个特征来进行预测。这就是多变量线性回归(Multivariate Linear Regression)。

我们引入新的记号:
- n:特征数量
- x^{(i)}:第 i 个训练样本的特征向量
- x^{(i)}_j:第 i 个训练样本的第 j 个特征值

多变量线性回归的假设函数:

$$h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \cdots + \theta_n x_n$$

为了表示方便,我们定义 x₀ = 1,那么可以将参数和特征向量化:

$$h_\theta(x) = \theta^T x = \begin{bmatrix} \theta_0 & \theta_1 & \cdots & \theta_n \end{bmatrix} \begin{bmatrix} x_0 \ x_1 \ \vdots \ x_n \end{bmatrix}$$

这种向量化的表示方式不仅简洁,而且在实现时可以利用高性能的线性代数库进行高效计算。

1.2 多变量梯度下降

多变量线性回归的代价函数与单变量完全一致:

$$J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2$$

梯度下降的参数更新规则也自然地扩展到多个参数:

$$\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)}$$

向量化实现:

predictions = X.dot(theta)
errors = predictions - y
gradient = (1/m) * X.T.dot(errors)
theta = theta - alpha * gradient

这个向量化的实现比 for 循环快很多倍,尤其是在特征数量大或训练样本多的情况下。

二、特征缩放

2.1 为什么要做特征缩放

当不同特征的数值范围差异很大的时候,梯度下降的收敛会非常缓慢。考虑房价预测:房屋面积在 50-500 平方米之间,而卧室数量在 1-5 之间。面积的数值范围是卧室数量的 100 倍。

在这种情况下,代价函数 J(θ) 的等高线图会呈现非常狭长的椭圆形,而不是接近圆形。梯度下降在这样的等高线图上会来回振荡——像走在一个狭长的山谷里——每次只能缓慢地向最低点移动一小步。

如果将所有特征缩放到相近的数值范围,等高线图会接近圆形,梯度下降可以直接指向最低点,收敛速度大大加快。

2.2 常用的特征缩放方法

方法一:均值归一化(Mean Normalization)

$$x_j^{(i)} = \frac{x_j^{(i)} - \mu_j}{s_j}$$

其中 μ_j 是特征 j 的均值,s_j 是特征 j 的范围(最大值-最小值)。

方法二:Z-score 标准化

$$x_j^{(i)} = \frac{x_j^{(i)} - \mu_j}{\sigma_j}$$

其中 σ_j 是特征 j 的标准差。

经过缩放后的特征值通常在 -1 到 1 之间。Andrew Ng 建议:如果某个特征的范围远大于其他特征,或者远不在 -1 到 1 的范围内,就应该进行特征缩放。

需要注意:特征缩放的均值和标准差只应该在训练集上计算,然后用同样的参数去缩放验证集和测试集。这是防止数据泄露的关键。

三、学习率的选择

3.1 调试梯度下降

如何判断梯度下降是否正常工作?最简单的方法是绘制代价函数 J(θ) 随迭代次数的变化曲线(学习曲线)。

正常情况:
- 每轮迭代 J(θ) 都应该下降
- 经过一定次数后 J(θ) 趋于平稳(收敛)
- 曲线平滑,没有明显振荡

异常情况:
- J(θ) 在某些迭代中上升——学习率太大
- J(θ) 振荡不降——学习率太大
- J(θ) 持续下降但太慢——学习率太小

自动收敛检测:如果 J(θ) 在一次迭代中的下降小于一个很小的阈值(如 10⁻ᶟ),可以认为已经收敛。但实践中用学习曲线来判断更可靠。

3.2 学习率的选择策略

Andrew Ng 推荐的策略:尝试一系列以约 3 倍递增的学习率值。

alphas = [0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1.0]

从较小的值开始,对每个 α 运行几次迭代,观察 J(θ) 的曲线:
- 如果曲线平滑下降,可以尝试更大的 α
- 如果曲线振荡或上升,说明 α 太大了
- 选择使 J(θ) 下降最快且不会振荡的最大 α 值

四、多项式回归

4.1 特征组合与多项式特征

有时线性模型不能很好地拟合数据。例如,房价可能随着面积的增加而上升,但到了一定程度后增速放缓。这时我们可以引入多项式特征:

$$h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3$$

但需要注意多项式特征的数值范围——x³ 的范围远超 x,因此特征缩放在此类模型中至关重要。

也可以使用开方等其他变换:

$$h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 \sqrt{x}$$

4.2 特征选择与模型复杂度

选择哪些特征、是否加入多项式特征,都会影响模型复杂度。更复杂的模型可以更好地拟合训练数据,但可能导致过拟合——在训练集上表现很好,但在新数据上表现很差。这引出了模型选择的重要概念,我们将在第 6 周详细讨论偏差与方差的权衡问题。

五、正规方程

5.1 正规方程的推导

梯度下降通过迭代逐步逼近最优参数。但线性回归有一个特殊性质——我们可以直接通过解析解一次性计算出最优参数,无需迭代。这就是正规方程(Normal Equation)。

代价函数的矩阵形式:

$$J(\theta) = \frac{1}{2m} (X\theta - y)^T (X\theta - y)$$

对 θ 求导并令导数为零:

$$\frac{\partial J}{\partial \theta} = \frac{1}{m} X^T (X\theta - y) = 0$$

$$X^T X \theta = X^T y$$

$$\theta = (X^T X)^{-1} X^T y$$

这就是正规方程——一步计算得到最优参数。

5.2 正规方程 vs 梯度下降

特性 梯度下降 正规方程
学习率 需要选择 α 不需要
迭代次数 需要多次迭代 一步求解
计算复杂度 O(kn²) O(n³)
特征数量 适合 n 很大的情况 n 很大时极慢
适用算法 几乎所有模型 仅线性回归

正规方程的计算瓶颈在于计算 (XᵀX)⁻¹——这是一个 n×n 矩阵的求逆,复杂度 O(n³)。当特征数量 n 超过 10,000 时,正规方程变得非常慢,此时梯度下降是更好的选择。

5.3 矩阵的不可逆问题

当 XᵀX 不可逆时,正规方程无法直接使用。常见原因:
1. 存在冗余特征(线性相关):例如 x₁ = 面积(平方米)和 x₂ = 面积(平方英尺)
2. 特征数量大于样本数量(n > m)

解决方案:删除冗余特征或使用正则化。正规方程的正则化版本:

$$\theta = (X^T X + \lambda I)^{-1} X^T y$$

添加 λI 项后,矩阵一定是可逆的。

六、Python 实现

import numpy as np

def feature_normalize(X):
    mu = np.mean(X, axis=0)
    sigma = np.std(X, axis=0)
    X_norm = (X - mu) / sigma
    return X_norm, mu, sigma

def gradient_descent_multi(X, y, theta, alpha, num_iters):
    m = len(y)
    J_history = np.zeros(num_iters)
    for i in range(num_iters):
        theta = theta - (alpha/m) * X.T.dot(X.dot(theta) - y)
        J_history[i] = compute_cost_multi(X, y, theta)
    return theta, J_history

def normal_eqn(X, y):
    return np.linalg.pinv(X.T.dot(X)).dot(X.T).dot(y)

第 2 周的核心内容是多变量线性回归。我们学习了如何处理多个特征、为什么需要以及如何进行特征缩放、如何选择学习率、如何构造多项式特征,以及一个不需要迭代的解析解——正规方程。这些内容是机器学习实践中的基本功,每个数据科学家都应该熟练掌握。

正规方程的深入理解

正规方程提供了一种优雅的解析解。从几何角度理解:Xθ 是特征矩阵列空间的向量,我们的目标是在这个空间中找到一个向量,使它最接近目标向量 y。这个"最接近"的向量就是 y 在 X 列空间上的正交投影——而正规方程 XᵀXθ = Xᵀy 正是这个投影的数学表达。

正规方程 vs 梯度下降的选择准则:
- 特征数量 n < 10,000:正规方程(不需要调参)
- 特征数量 n > 10,000:梯度下降(计算复杂度可控)
- 算法不是线性回归:必须用梯度下降

多变量特征缩放的具体实现

在 Python 中,特征缩放的具体实现需要特别注意:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)   # 在训练集上拟合
X_val_scaled = scaler.transform(X_val)            # 使用训练集的参数
X_test_scaled = scaler.transform(X_test)          # 使用训练集的参数

绝对不能对整个数据集(包括验证集和测试集)同时进行 fit_transform——这会引入数据泄露。

多项式特征与过拟合

使用多项式特征时,模型复杂度显著增加。一个 d 次多项式有 d+1 个参数,随着 d 的增大:
- 模型在训练集上的误差持续下降
- 但在测试集上的误差先降后升(U 形曲线)

这种现象反映了偏差-方差权衡:多项式次数太低(高偏差/欠拟合),太高(高方差/过拟合)。选择一个适中的次数是关键。

特征选择的启发式方法

在构造多项式特征之前,先问自己几个问题:
1. 领域知识是否暗示某个特征变换有用?(如人口增长通常用对数)
2. 可视化数据分布后,是否看到非线性模式?
3. 简单的线性模型是否已经足够?

不要一开始就加入大量多项式特征——从简单的模型开始,用学习曲线诊断是否需要更复杂的特征。

延伸阅读

← 第1周:引言与线性回归 第3周:逻辑回归与正则化 →