题目
实现并解释线性回归的梯度下降算法
信息
- 类型:问答
- 难度:⭐⭐
考点
线性回归原理,梯度下降实现,特征缩放,模型评估
快速回答
实现线性回归梯度下降的关键步骤:
- 初始化参数:随机设置权重和偏置
- 特征缩放:使用标准化处理特征(提高收敛速度)
- 计算梯度:实现代价函数和偏导数计算
- 迭代更新:按学习率更新参数直到收敛
- 评估模型:计算均方误差(MSE)或R²分数
核心公式:
预测值:$\hat{y} = w^Tx + b$
梯度:$\frac{\partial J}{\partial w} = \frac{1}{m}X^T(Xw - y)$
解析
1. 原理说明
线性回归通过$y = w^Tx + b$拟合数据,梯度下降最小化均方误差代价函数:
$J(w,b) = \frac{1}{2m}\sum_{i=1}^m (\hat{y}^{(i)} - y^{(i)})^2$
通过计算代价函数对参数$w$和$b$的偏导数,沿负梯度方向更新参数:
$w := w - \alpha \frac{\partial J}{\partial w}$
$b := b - \alpha \frac{\partial J}{\partial b}$
2. 代码实现
import numpy as np
def gradient_descent(X, y, lr=0.01, epochs=1000):
# 特征缩放
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)
# 添加偏置列
X = np.c_[np.ones(X.shape[0]), X]
# 初始化参数
w = np.zeros(X.shape[1])
m = len(y)
# 迭代更新
for _ in range(epochs):
y_pred = X.dot(w)
error = y_pred - y
# 计算梯度 (向量化实现)
gradient = (1/m) * X.T.dot(error)
# 更新参数
w -= lr * gradient
return w
# 示例用法
X = np.array([[1], [2], [3]])
y = np.array([2, 3, 4])
weights = gradient_descent(X, y)
print(f"模型参数: w={weights[1]:.2f}, b={weights[0]:.2f}")3. 最佳实践
- 特征缩放:标准化(Z-score)或归一化加速收敛
- 学习率选择:使用学习率衰减(如0.1→0.01)或尝试0.001, 0.003, 0.01等值
- 收敛判断:设置阈值(如代价变化<1e-5)而非固定epochs
- 向量化计算:使用NumPy矩阵运算提升性能
4. 常见错误
- 未归一化特征:导致收敛缓慢或震荡
- 学习率过大:代价函数震荡发散(需减小学习率)
- 学习率过小:收敛速度过慢(需增加epochs)
- 忘记添加偏置项:导致模型无法拟合截距
5. 扩展知识
- 优化变体:随机梯度下降(SGD)和小批量梯度下降
- 正则化:L2正则化(岭回归)防止过拟合
- 多项式回归:通过特征工程拟合非线性关系
- 评估指标:MSE、MAE、R²,交叉验证评估泛化能力