Course 1:线性回归与梯度下降
课程简介
从单变量回归到多变量回归,理解代价函数、梯度下降与特征缩放。
一、线性回归:从单变量到多变量
线性回归是机器学习中最基础的监督学习算法。它的目标是学习一个线性函数来拟合训练数据,使得模型对新输入的预测尽可能准确。
1.1 单变量线性回归
在最简单的单变量场景中,我们有一个输入特征 x 和一个输出值 y。模型的形式为:
$$f_{w,b}(x) = wx + b$$
其中 w 是权重(斜率),b 是偏置(截距)。模型的参数 θ = (w, b) 需要通过训练数据学习得到。
损失函数使用均方误差(MSE):
$$J(w,b) = \frac{1}{2m} \sum_{i=1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)})^2$$
前面的 1/2 系数是为了后续求导时抵消平方项的系数,使梯度表达式更简洁。
1.2 多变量线性回归
实际应用中,我们通常有多个特征。例如预测房价时,可能用到面积、卧室数量、楼层、房龄等多个特征。多变量线性回归的模型为:
$$f_{w,b}(x) = w_1 x_1 + w_2 x_2 + ... + w_n x_n + b = w \cdot x + b$$
使用向量化的形式可以简洁地表达:
$$f_{w,b}(X) = Xw + b$$
其中 X 是 m×n 矩阵(m 个样本,n 个特征),w 是 n 维权重向量。
二、梯度下降
2.1 算法原理
梯度下降是机器学习中最核心的优化算法。它的目标是找到使损失函数 J(w,b) 最小的参数值。
算法的核心思想是:在当前位置计算损失函数的梯度(即一阶导数),然后沿着梯度的反方向迈出一步。重复这个过程直到收敛。
$$egin{align}
w_j &:= w_j - \alpha \frac{\partial}{\partial w_j} J(w,b) \
b &:= b - \alpha \frac{\partial}{\partial b} J(w,b)
\end{align}$$
其中 α 是学习率,控制每次更新的步长。
2.2 学习率的选择
学习率是梯度下降中最关键的超参数:
- 学习率过大:参数更新步长太大,可能在最小值附近震荡甚至发散。损失曲线会上下剧烈跳动。
- 学习率过小:收敛速度极慢,需要大量迭代次数。损失曲线缓慢下降。
- 合适的学习率:损失曲线平滑下降,在合理迭代次数内收敛。
实践经验:
- 从 α = 0.01 开始尝试
- 以约 3 倍为间隔尝试不同值:0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1.0
- 观察损失曲线的下降情况来调整
2.3 梯度下降的变体
批梯度下降(Batch GD):每次迭代使用全部训练样本计算梯度。对于大规模数据集,一次迭代的计算量太大。
随机梯度下降(SGD):每次迭代只使用一个随机样本计算梯度。梯度方向噪声大,但计算快,且有机会跳出局部极小值。
小批量梯度下降(Mini-batch GD):折中方案——每次使用 32-512 个样本。兼顾了计算效率和梯度质量。
def gradient_descent(X, y, w, b, alpha, num_iters):
m = X.shape[0]
for i in range(num_iters):
# 预测
y_pred = np.dot(X, w) + b
# 计算梯度
dw = (1/m) * np.dot(X.T, (y_pred - y))
db = (1/m) * np.sum(y_pred - y)
# 更新参数
w = w - alpha * dw
b = b - alpha * db
return w, b
三、特征缩放
3.1 为什么需要特征缩放
当不同特征的数值范围相差很大时(如房价预测中,面积 1000-3000 平方英尺,卧室数 1-5 个),梯度下降的收敛会变得非常缓慢。
原因在于:数值范围大的特征对应的权重 w 的梯度也大,数值范围小的特征的梯度也小。这会导致等高线图的形状拉长,梯度下降在窄长山谷中来回震荡。
3.2 常用缩放方法
归一化(Min-Max Scaling):
$$x_{\text{norm}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}}$$
将数据缩放到 [0, 1] 区间。适用于数据分布均匀的情况。
标准化(Z-score Normalization):
$$x_{\text{std}} = \frac{x - \mu}{\sigma}$$
将数据变换为均值为 0、标准差为 1 的分布。适用于数据存在异常值的情况。
3.3 何时应用特征缩放
- 使用梯度下降时:必须做特征缩放
- 使用正规方程时:不需要
- 使用决策树/随机森林时:不需要
- 使用 SVM、神经网络时:通常需要
四、正规方程(选读)
对于线性回归,可以推导出闭式解。令 X 为设计矩阵(包含偏置项),y 为目标向量:
$$w = (X^T X)^{-1} X^T y$$
优点:不需要选择学习率,不需要迭代
缺点:当 n > 10000 时,计算 (X^T X)^{-1} 复杂度为 O(n³),非常慢
五、实战案例:波士顿房价预测
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# 加载数据
# X: 特征矩阵, y: 目标值
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 训练
w = np.zeros(X_train.shape[1])
b = 0.0
alpha = 0.01
num_iters = 1000
w, b, J_history = gradient_descent(X_train, y_train, w, b, alpha, num_iters)
# 评估
y_pred = np.dot(X_test, w) + b
mse = np.mean((y_pred - y_test) ** 2)
print(f"Test MSE: {mse:.4f}")
这个实战案例展示了从数据预处理到模型训练再到评估的完整流程。特征缩放、学习率选择、损失监控是线性回归实践中的关键环节。
延伸阅读
- 📺 B 站播放列表:Machine Learning Specialization (2022) — 新版机器学习
- 📚 更多学习资源,请访问 deeplearning.ai 官网