侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1824 篇文章
  • 累计收到 0 条评论

实现并解释线性回归的梯度下降算法

2025-12-12 / 0 评论 / 4 阅读

题目

实现并解释线性回归的梯度下降算法

信息

  • 类型:问答
  • 难度:⭐⭐

考点

线性回归原理,梯度下降实现,特征缩放,模型评估

快速回答

实现线性回归梯度下降的关键步骤:

  1. 初始化参数:随机设置权重和偏置
  2. 特征缩放:使用标准化处理特征(提高收敛速度)
  3. 计算梯度:实现代价函数和偏导数计算
  4. 迭代更新:按学习率更新参数直到收敛
  5. 评估模型:计算均方误差(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²,交叉验证评估泛化能力