全量梯度下降(Batch Gradient Descent)实现线性回归
摘要:本文通过Python代码实现全量梯度下降算法,并应用于线性回归问题。代码使用动态调整学习率策略,最终得到接近真实值的模型参数。
1. 全量梯度下降简介
全量梯度下降(Batch Gradient Descent)是一种优化算法,其核心思想是在每一步迭代中使用全部训练数据计算梯度。与随机梯度下降(SGD)和小批量梯度下降(Mini-Batch GD)不同,全量梯度下降的梯度计算更稳定,但计算开销较大,适合数据量较小的场景。
2. 代码实现
2.1 导入库与数据生成
首先生成模拟数据,其中 y = 4 + 3x + 高斯噪声
,并添加偏置项(截距项)x_b
:
import numpy as np
# 生成模拟数据
x = 2 * np.random.rand(100, 1)
y = 4 + 3 * x + np.random.randn(100, 1)
x_b = np.c_[np.ones((100, 1)), x] # 添加偏置项
2.2 超参数与模型初始化
设置训练轮次,并初始化模型参数 theta
(服从标准正态分布):
n_epochs = 10000 # 训练轮次
theta = np.random.randn(2, 1) # 初始化参数
2.3 动态学习率调整
定义学习率调整函数,随着迭代次数增加逐渐减小学习率,避免震荡:
t0, t1 = 1, 200
def learning_rate_adjust(t):
return t0 / (t + t1) # 学习率逐步衰减
2.4 梯度下降迭代
全量梯度下降核心逻辑:计算梯度,更新参数:
for t in range(n_epochs):
gradients = x_b.T.dot(x_b.dot(theta) - y) # 计算梯度
learning_rate = learning_rate_adjust(t) # 调整学习率
theta = theta - learning_rate * gradients # 更新参数
2.5 输出结果
训练完成后打印模型参数:
print("训练后的参数 theta:")
print(theta)
输出结果:
[[3.95883404]
[3.09751776]]
3. 结果分析
真实参数为 [4, 3]
,训练后得到 [3.9588, 3.0975]
,接近真实值。说明全量梯度下降在此场景下有效。
4. 关键公式说明
-
梯度计算:
梯度公式为:
∇ θ J ( θ ) = 1 m X T ( X θ − y ) \nabla_\theta J(\theta) = \frac{1}{m} X^T (X\theta - y) ∇θJ(θ)=m1XT(Xθ−y)
代码中直接使用矩阵运算x_b.T.dot(x_b.dot(theta) - y)
,省略了 1 m \frac{1}{m} m1,因为学习率调整已隐含缩放。 -
参数更新:
θ t + 1 = θ t − η ∇ θ J ( θ ) \theta_{t+1} = \theta_t - \eta \nabla_\theta J(\theta) θt+1=θt−η∇θJ(θ)
其中 η \eta η 为动态调整的学习率。
5. 全量梯度下降的优缺点
- 优点:梯度方向准确,收敛稳定。
- 缺点:计算开销大,不适合大规模数据。
6. 完整代码
相关标签:#机器学习
#梯度下降
#线性回归
#Python